Saya memiliki banyak ke banyak hubungan yang disiapkan dan berfungsi, untuk menambahkan item ke keranjang yang saya gunakan:
$cart->items()->attach($item);
Yang menambahkan item ke tabel pivot (sebagaimana mestinya), tetapi jika pengguna mengklik link lagi untuk menambahkan item, mereka telah menambahkannya, itu membuat entri duplikat di tabel pivot.
Apakah ada cara bawaan untuk menambahkan catatan ke tabel pivot hanya jika belum ada?
Jika tidak, bagaimana cara memeriksa tabel pivot untuk mengetahui apakah data yang cocok sudah ada?
attach()
ini dicampur, dapat berupa int atau turunan model;) - lihat github.com/laravel/framework/blob/master/src/Illuminate/…contains
Pernyataan @ bagusflyer memeriksa apakah kunci ada dalam satu objek dalam koleksi. Seharusnya ada kesalahan dalam kode Anda.$cart->items()->where('foreign_key', $foreignKey)->count()
Yang, sebenarnya, melakukan kueri tambahan juga '^^ Tapi saya tidak perlu mengambil dan melembabkan seluruh koleksi kecuali saya benar-benar membutuhkannya.exists()
fungsi tersebut alih-alihcount()
untuk pengoptimalan terbaik.Anda juga dapat menggunakan
$model->sync(array $ids, $detaching = true)
metode ini dan menonaktifkan detaching (parameter kedua).Pembaruan: Sejak Laravel 5.3 atau 5.2.44, Anda juga dapat memanggil syncWithoutDetaching:
Yang persis sama, tetapi lebih mudah dibaca :)
sumber
$cart->items()->sync([1, 2, 3])
akan membangun banyak-ke-banyak hubungan dengan id dalam array yang diberikan,1
,2
, dan3
, dan menghapus (atau "detach") semua id lainnya tidak dalam array. Dengan cara ini, hanya id yang diberikan dalam array yang akan ada di tabel. Brilliant @Barryvdh menggunakan parameter kedua yang tidak terdokumentasi untuk menonaktifkan pelepasan tersebut, jadi tidak ada hubungan yang tidak dalam larik yang diberikan yang dihapus tetapi hanya id unik yang akan dilampirkan. Lihat dokumen "sinkronisasi untuk kenyamanan". (Laravel 5.2)syncWithoutDetaching()
, yang memanggil sync () dengan false sebagai param kedua.syncWithoutDetaching()
bekerja!Metode @alexandre Butynsky bekerja dengan sangat baik tetapi menggunakan dua kueri sql.
Satu untuk memeriksa apakah gerobak berisi item dan satu lagi untuk disimpan.
Untuk menggunakan hanya satu kueri gunakan ini:
sumber
Sebagus semua jawaban ini adalah karena saya telah mencoba semuanya, satu hal yang masih belum terjawab atau tidak diurus: masalah memperbarui nilai yang dicentang sebelumnya (hapus centang pada kotak yang dicentang [es]). Saya memiliki sesuatu yang mirip dengan pertanyaan di atas, saya harap saya ingin memeriksa dan menghapus centang fitur produk di tabel fitur produk saya (tabel pivot). Saya seorang pemula dan saya telah menyadari tidak satu pun di atas yang melakukan itu. Keduanya bagus saat menambahkan fitur baru tetapi tidak saat saya ingin menghapus fitur yang ada (yaitu, hapus centang)
Saya akan menghargai pencerahan apapun dalam hal ini.
atau
Maaf teman-teman, saya tidak yakin saya harus menghapus pertanyaannya karena setelah mengetahui jawabannya sendiri, kedengarannya agak bodoh, nah jawaban di atas sesederhana bekerja @Barryvdh sync () sebagai berikut; setelah membaca lebih banyak tentang:
sumber
Ada beberapa jawaban bagus yang sudah diposting. Aku juga ingin membuang yang ini di sini.
Jawaban dari @AlexandreButynski dan @Barryvdh lebih mudah dibaca daripada saran saya, yang ditambahkan oleh jawaban ini adalah beberapa efisiensi.
Ia hanya mengambil entri untuk kombinasi saat ini (sebenarnya hanya id) dan kemudian melampirkannya jika tidak ada. Metode sinkronisasi (bahkan tanpa melepaskan) mengambil semua id yang saat ini terpasang. Untuk set yang lebih kecil dengan sedikit iterasi, ini tidak akan menjadi perbedaan, ... Anda mengerti maksud saya.
Bagaimanapun, ini pasti tidak dapat dibaca, tetapi itu berhasil.
sumber