Saya mencoba mengumpulkan beberapa informasi tentang cara berikut untuk menghapus entitas anak secara otomatis ketika entitas induk dihapus. Tampaknya cara yang paling umum adalah menggunakan salah satu dari tiga anotasi tersebut: cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE" .
Saya agak bingung tentang yang ketiga: ondelete = "CASCADE" , karena penjelasan dalam dokumentasi resmi doktrin tentang yang satu ini sangat langka) dan saya akan sangat senang jika seseorang dapat mengkonfirmasi kepada saya informasi berikut yang saya kumpulkan dan pahami dari penelitian saya tentang bersih dan pengalaman ...
APA YANG DILAKUKANNYA
cascade = {"remove"}
==> entitas di sisi terbalik dihapus ketika entitas sisi yang memiliki adalah. Bahkan jika Anda berada di banyak orang dengan entitas sisi lain yang memiliki.
- harus digunakan pada pengumpulan (jadi dalam hubungan OneToMany atau ManyToMany)
- implementasi di ORM
orphanRemoval = true
==> entitas di sisi terbalik dihapus ketika entitas sisi pemilik adalah DAN tidak lagi terhubung ke entitas sisi pemilik lainnya. (ref. doktrin official_doc
- implementasi di ORM
- dapat digunakan dengan OneToOne, OnetoMany atau ManyToMany
onDelete = "CASCADE"
==> ini akan menambahkan On Delete Cascade ke kolom kunci asing dalam database
- Strategi ini agak sulit dilakukan tetapi bisa sangat kuat dan cepat. (ref. doktrin official_doc ... tetapi belum membaca lebih banyak penjelasan)
- ORM harus melakukan lebih sedikit pekerjaan (dibandingkan dengan dua cara melakukan sebelumnya) dan oleh karena itu harus memiliki kinerja yang lebih baik.
informasi lain
- semua 3 cara melakukannya diimplementasikan pada entitas hubungan dua arah ( benar ??? )
- menggunakan cascade = {"remove"} sepenuhnya melewati kunci asing apa pun onDelete = CASCADE. (ref. doktrin_official_doc )
CONTOH CARA MENGGUNAKANNYA DALAM KODE
- orphanRemoval dan cascade = {"remove"} ditentukan dalam kelas entitas terbalik.
- ondelete = "CASCADE" didefinisikan dalam entitas pemilik
- Anda juga dapat menulis @ORM \ JoinColumn (onDelete = "CASCADE") dan biarkan doktrin menangani nama kolom
cascade = {"remove"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = true
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "CASCADE"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;
Jawaban:
onDelete="CASCADE"
dikelola oleh database itu sendiri.cascade={"remove"}
dikelola oleh doktrin.onDelete="CASCADE"
lebih cepat karena operasi dilakukan pada tingkat database, bukan berdasarkan doktrin. Penghapusan dilakukan oleh server database dan bukan Doktrin. Dengancascade={"remove"}
doktrin harus mengelola entitas itu sendiri dan akan melakukan pemeriksaan ekstra untuk melihat apakah ia tidak memiliki entitas pemilik lainnya. Jika tidak ada yang lain, entitas tersebut akan dihapus. Tapi ini menciptakan overhead.cascade = {"remove"}
orphanRemoval = "true"
onDelete = "CASCADE"
sumber