Pembaruan 2020
Seperti pada Laravel> = 5.3 , jika seseorang masih penasaran bagaimana melakukannya dengan cara mudah. Itu mungkin dengan menggunakan:updateOrCreate()
.
Misalnya untuk pertanyaan yang diajukan, Anda dapat menggunakan sesuatu seperti:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Kode di atas akan memeriksa tabel yang diwakili oleh ShopMeta, yang kemungkinan besar akan terjadi shop_metas
kecuali tidak ditentukan sebaliknya dalam model itu sendiri
dan akan mencoba menemukan entri dengan
kolom shopId = $theID
dan
kolom metadateKey = 2001
dan jika ditemukan maka akan memperbarui kolom shopOwner
baris yang ditemukan keNew One
.
Jika menemukan lebih dari satu baris yang cocok maka itu akan memperbarui baris pertama yang berarti yang memiliki primer terendah id
.
Jika tidak ditemukan sama sekali maka akan memasukkan baris baru dengan:
shopId = $theID
, metadateKey = 2001
danshopOwner = New One
Perhatikan
Periksa model Anda untuk $fillable
dan membuat tuntutan bahwa Anda memiliki setiap nama kolom yang ditetapkan di mana Anda ingin memasukkan atau memperbarui dan kolom istirahat memiliki nilai default atauid
kolomnya otomatis bertambah satu.
Jika tidak, akan terjadi kesalahan saat menjalankan contoh di atas:
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))'
Karena akan ada beberapa bidang yang akan membutuhkan nilai saat memasukkan baris baru dan itu tidak akan mungkin karena itu tidak didefinisikan $fillable
atau tidak memiliki nilai default.
Untuk referensi lebih lanjut silakan lihat Dokumentasi Laravel di:
https://laravel.com/docs/5.3/eloquent
Salah satu contoh dari sana adalah:
// 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]
);
yang cukup banyak membersihkan segalanya.
Pembaruan Pembuat Kueri
Seseorang bertanya apakah mungkin menggunakan Query Builder di Laravel. Berikut ini adalah referensi untuk Pembuat Kueri dari Laravel docs.
Query Builder bekerja persis sama dengan Eloquent sehingga segala sesuatu yang berlaku untuk Eloquent juga berlaku untuk Query Builder. Jadi untuk kasus khusus ini, cukup gunakan fungsi yang sama dengan pembuat kueri Anda seperti:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Tentu saja, jangan lupa menambahkan fasad DB:
use Illuminate\Support\Facades\DB;
ATAU
use DB;
Saya harap ini membantu
shopId
ini bukan kunci utama Anda, bukan?