Saat saya menghapus baris menggunakan sintaks ini:
$user->delete();
Apakah ada cara untuk melampirkan semacam callback, sehingga misalnya akan melakukan ini secara otomatis:
$this->photo()->delete();
Lebih disukai di dalam kelas model.
Saya percaya ini adalah kasus penggunaan yang sempurna untuk acara Eloquent ( http://laravel.com/docs/eloquent#model-events ). Anda dapat menggunakan acara "menghapus" untuk melakukan pembersihan:
class User extends Eloquent
{
public function photos()
{
return $this->has_many('Photo');
}
// this is a recommended way to declare event handlers
public static function boot() {
parent::boot();
static::deleting(function($user) { // before delete() method call this
$user->photos()->delete();
// do the rest of the cleanup...
});
}
}
Anda mungkin juga harus memasukkan semuanya ke dalam transaksi, untuk memastikan integritas referensial ..
first()
ke dalam query sehingga saya bisa mengakses model-event misalnyaUser::where('id', '=', $id)->first()->delete();
Sumberforeach($user->photos as $photo)
, kemudian$photo->delete()
untuk memastikan setiap anak memiliki anak-anak dihapus pada semua tingkatan, bukan hanya satu seperti yang terjadi karena suatu alasan.Photos
memilikitags
dan Anda melakukan hal yang sama dalamPhotos
model (yaitu padadeleting
metode$photo->tags()->delete();
:) tidak pernah mendapat pemicu. Tetapi jika saya membuatnyafor
lingkaran dan melakukan sesuatu sepertifor($user->photos as $photo) { $photo->delete(); }
makatags
juga bisa dihapus! just FYIAnda sebenarnya dapat mengatur ini di migrasi Anda:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Sumber: http://laravel.com/docs/5.1/migrations#foreign-key-constraints
sumber
Anda dapat menghapus semua foto terkait sebelum benar-benar menghapus pengguna.
Semoga ini bisa membantu.
sumber
$this->photos()->delete()
. Thephotos()
mengembalikan objek query builder.Hubungan dalam model Pengguna:
Hapus rekaman dan yang terkait:
sumber
Ada 3 pendekatan untuk menyelesaikan ini:
1. Menggunakan Eloquent Events Pada Model Boot (ref: https://laravel.com/docs/5.7/eloquent#events )
2. Menggunakan Pengamat Acara Eloquent (ref: https://laravel.com/docs/5.7/eloquent#observers )
Di AppServiceProvider Anda, daftarkan pengamat seperti:
Selanjutnya, tambahkan kelas Observer seperti:
3. Menggunakan Batasan Kunci Asing (ref: https://laravel.com/docs/5.7/migrations#foreign-key-constraints )
sumber
Pada Laravel 5.2, dokumentasi menyatakan bahwa jenis penangan acara ini harus terdaftar di AppServiceProvider:
Saya bahkan berpikir untuk memindahkan mereka ke kelas yang terpisah, bukan penutup untuk struktur aplikasi yang lebih baik.
sumber
Eloquent::observe()
metode ini tersedia dalam 5.2 juga dan dapat digunakan dari AppServiceProvider.photos()
, Anda juga harus berhati-hati - proses ini tidak akan menghapus cucu karena Anda tidak memuat model. Anda harus mengulangphotos
(perhatikan, tidakphotos()
) dan jalankandelete()
metode pada mereka sebagai model untuk memecat peristiwa terkait penghapusan.Lebih baik jika Anda mengganti
delete
metode untuk ini. Dengan begitu, Anda bisa memasukkan transaksi DB dalamdelete
metode itu sendiri. Jika Anda menggunakan cara acara, Anda harus menutup panggilandelete
metode Anda dengan transaksi DB setiap kali Anda menyebutnya.Dalam
User
model Anda .sumber
Dalam kasus saya itu cukup sederhana karena tabel database saya adalah InnoDB dengan kunci asing dengan Cascade on Delete.
Jadi dalam hal ini jika tabel foto Anda berisi referensi kunci asing untuk pengguna daripada yang harus Anda lakukan adalah menghapus hotel dan pembersihan akan dilakukan oleh Pangkalan Data, basis data akan menghapus semua catatan foto dari data tersebut. mendasarkan.
sumber
Saya akan beralih melalui koleksi yang memisahkan semuanya sebelum menghapus objek itu sendiri.
ini sebuah contoh:
Saya tahu ini tidak otomatis tetapi sangat sederhana.
Pendekatan sederhana lain adalah menyediakan model dengan metode. Seperti ini:
Maka Anda cukup memanggil ini di tempat yang Anda butuhkan:
sumber
Atau Anda dapat melakukan ini jika mau, hanya opsi lain:
Catatan jika Anda tidak menggunakan koneksi default laravel db maka Anda perlu melakukan hal berikut:
sumber
Untuk menguraikan jawaban yang dipilih, jika hubungan Anda juga memiliki hubungan anak yang harus dihapus, Anda harus mengambil semua catatan hubungan anak terlebih dahulu, kemudian memanggil
delete()
metode tersebut sehingga peristiwa penghapusannya juga dipecat dengan benar.Anda dapat melakukan ini dengan mudah dengan pesan tingkat tinggi .
Anda juga dapat meningkatkan kinerja dengan hanya menanyakan kolom ID hubungan:
sumber
ya, tetapi seperti yang dikatakan @supersan di bagian atas dalam komentar, jika Anda menghapus () di QueryBuilder, acara model tidak akan diaktifkan, karena kami tidak memuat model itu sendiri, lalu memanggil delete () pada model itu.
Peristiwa dipecat hanya jika kita menggunakan fungsi hapus pada Instance Model.
Jadi, beeing ini berkata:
untuk menghapus tag posting ketika menghapus pengguna, kita harus mengulang
$user->posts
dan menelepon$post->delete()
foreach($user->posts as $post) { $post->delete(); }
-> ini akan memecat acara penghapusan di PostingVS
$user->posts()->delete()
-> ini tidak akan mem-boot event penghapusan pada postingan karena kita sebenarnya tidak memuat Post Model (kita hanya menjalankan SQL like:DELETE * from posts where user_id = $user->id
dan dengan demikian, model Post bahkan tidak dimuat)sumber
Anda dapat menggunakan metode ini sebagai alternatif.
Apa yang akan terjadi adalah bahwa kami mengambil semua tabel yang terkait dengan tabel pengguna dan menghapus data terkait menggunakan perulangan
sumber