2563 ปรับปรุง
เช่นเดียวกับในLaravel> = 5.3หากใครบางคนยังสงสัยว่าจะทำอย่างไรในวิธีที่ง่าย เป็นไปได้โดยใช้: updateOrCreate()
.
ตัวอย่างเช่นคำถามที่ถามคุณสามารถใช้สิ่งที่ชอบ:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
โค้ดด้านบนจะตรวจสอบตารางที่แสดงโดย ShopMeta ซึ่งจะเป็นไปได้มากที่สุดshop_metas
เว้นแต่จะไม่ได้กำหนดไว้เป็นอย่างอื่นในโมเดล
และจะพยายามค้นหารายการด้วย
คอลัมน์ shopId = $theID
และ
คอลัมน์ metadateKey = 2001
และหากพบก็จะปรับปรุงคอลัมน์ของพบแถวshopOwner
New One
id
หากพบมากกว่าหนึ่งแถวจับคู่แล้วมันจะอัปเดตแถวแรกที่วิธีการที่มีต่ำสุดหลัก
หากไม่พบเลยจะมีการแทรกแถวใหม่ด้วย:
shopId = $theID
, metadateKey = 2001
และshopOwner = New One
แจ้งให้ทราบ$fillable
ล่วงหน้า
ตรวจสอบรุ่นของคุณและฟ้องว่าคุณมีทุกชื่อคอลัมน์ที่กำหนดไว้ที่คุณต้องการแทรกหรือปรับปรุงและคอลัมน์ส่วนที่เหลือมีค่าเริ่มต้นหรือid
คอลัมน์ที่เพิ่มขึ้นโดยอัตโนมัติอย่างใดอย่างหนึ่ง
มิฉะนั้นจะเกิดข้อผิดพลาดเมื่อดำเนินการตัวอย่างด้านบน:
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'
เนื่องจากจะมีฟิลด์บางฟิลด์ที่ต้องการค่าขณะแทรกแถวใหม่และจะไม่สามารถทำได้เนื่องจากไม่ได้กำหนดไว้$fillable
หรือไม่มีค่าเริ่มต้น
สำหรับการอ้างอิงเพิ่มเติมโปรดดูเอกสาร Laravel ที่:
https://laravel.com/docs/5.3/eloquent
ตัวอย่างหนึ่งจากนั้นคือ:
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
ซึ่งค่อนข้างล้างทุกอย่าง
ปรับปรุงตัวสร้างแบบสอบถาม
มีคนถามว่าเป็นไปได้หรือไม่หากใช้ Query Builder ใน Laravel นี่คือการอ้างอิงสำหรับตัวสร้างแบบสอบถามจากเอกสาร Laravel
ตัวสร้างแบบสอบถามทำงานเหมือนกับ Eloquent ดังนั้นทุกอย่างที่เป็นจริงสำหรับ Eloquent นั้นเป็นจริงสำหรับตัวสร้างแบบสอบถามด้วยเช่นกัน ดังนั้นสำหรับกรณีเฉพาะนี้ให้ใช้ฟังก์ชันเดียวกันกับตัวสร้างคิวรีของคุณดังนี้
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
แน่นอนอย่าลืมเพิ่มซุ้มฐานข้อมูล:
use Illuminate\Support\Facades\DB;
หรือ
use DB;
ฉันหวังว่ามันจะช่วย
shopId
ว่าไม่ใช่คีย์หลักของคุณใช่ไหม