Apa singkatan untuk menyisipkan catatan baru atau memperbarui jika ada?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
ini bukan kunci utama Anda, bukan?Jawaban:
Berikut adalah contoh lengkap dari apa yang "lu cip" bicarakan:
Di bawah ini adalah tautan terbaru dari dokumen yang ada pada versi terbaru Laravel
Documents di sini: Tautan yang diperbarui
sumber
Diperbarui: 27 Agustus 2014 - [
updateOrCreate
Dibangun menjadi inti ...]Kalau-kalau ada orang masih menemukan ini ... Saya tahu beberapa minggu setelah menulis ini, bahwa ini sebenarnya bagian dari inti Llovel's Eloquent ...
Menggali metode setara Eloquent. Anda bisa lihat di sini:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
pada: 570 dan: 553
Jawaban Lama Di Bawah Ini
Saya bertanya-tanya apakah ada fungsi L4 bawaan untuk melakukan ini dalam beberapa cara seperti:
Saya memang membuat metode ini beberapa minggu yang lalu ...
Saya harap itu membantu. Saya akan senang melihat alternatif untuk ini jika ada yang punya satu untuk dibagikan. @erikthedev_
sumber
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
harus melakukannya.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:
Kode di atas akan memeriksa tabel yang diwakili oleh ShopMeta, yang kemungkinan besar akan terjadi
shop_metas
kecuali tidak ditentukan sebaliknya dalam model itu sendiridan 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:
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:
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:
Tentu saja, jangan lupa menambahkan fasad DB:
ATAU
Saya harap ini membantu
sumber
Simpan fungsi:
sudah melakukan apa yang Anda inginkan ...
Kode Laravel:
sumber
firstOrNew
akan membuat catatan jika tidak ada dan memperbarui baris jika sudah ada. Anda juga bisa menggunakan diupdateOrCreate
sini adalah contoh lengkapnyaJika ada penerbangan dari Oakland ke San Diego, tetapkan harga menjadi $ 99. jika tidak ada buat baris baru
Referensi Doc di sini: ( https://laravel.com/docs/5.5/eloquent )
sumber
Jika Anda membutuhkan fungsi yang sama menggunakan
DB
, di Laravel>= 5.5
Anda dapat menggunakan:atau versi steno kapan
$attributes
dan$values
sama:sumber
Kemudian buat perubahan dan simpan. Perhatikan bahwa firstOrNew baru tidak melakukan penyisipan jika tidak ditemukan, jika Anda memang membutuhkannya maka yang pertama OrCreate.
sumber
Satu lagi opsi jika id Anda bukan autoincrement dan Anda tahu mana yang harus dimasukkan / perbarui:
sumber
Seperti metodeOrCreate pertama, updateOrCreate tetap menggunakan model, jadi tidak perlu memanggil save ()
Dan untuk masalah Anda
sumber
Sebenarnya firstOrCreate tidak akan memperbarui jika register sudah ada di DB. Saya meningkatkan sedikit solusi Erik karena saya benar-benar perlu memperbarui tabel yang memiliki nilai unik tidak hanya untuk kolom "id"
Maka Anda akan menggunakannya seperti ini:
sumber
seperti @JuanchoRamone yang diposting di atas (terima kasih @Juancho) itu sangat berguna bagi saya, tetapi jika data Anda adalah array, Anda harus memodifikasi sedikit seperti ini:
sumber
https://github.com/yadakhov/insert-on-duplicate-key
sumber
periksa apakah ada pengguna atau tidak. Jika tidak disisipkan
sumber