Tôi đã cố gắng thu thập một số thông tin về những cách sau để xóa thực thể con tự động khi thực thể mẹ bị xóa. Có vẻ như cách phổ biến nhất là sử dụng một trong ba chú thích đó: cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE" .
Tôi hơi nhầm lẫn về cái thứ ba: ondelete = "CASCADE" , vì lời giải thích trong tài liệu chính thức về học thuyết về cái này rất hiếm) và tôi rất muốn ai đó có thể xác nhận cho tôi những thông tin sau mà tôi thu thập và hiểu được từ nghiên cứu của mình về net và kinh nghiệm ...
NHỮNG GÌ NÓ LÀM
cascade = {"remove"}
==> thực thể ở phía nghịch đảo bị xóa khi thực thể phía sở hữu được. Ngay cả khi bạn đang ở trong nhiều tổ chức với thực thể bên sở hữu khác.
- nên được sử dụng trên bộ sưu tập (vì vậy trong mối quan hệ OneToMany hoặc ManyToMany)
- triển khai trong ORM
orphanRemoval = true
==> thực thể ở phía nghịch đảo bị xóa khi thực thể bên sở hữu VÀ nó không được kết nối với bất kỳ thực thể bên sở hữu nào khác nữa. (tham chiếu học thuyết official_doc
- triển khai trong ORM
- có thể được sử dụng với OneToOne, OnetoMany hoặc ManyToMany
onDelete = "CASCADE"
==> điều này sẽ thêm On Delete Cascade vào cột khóa ngoại trong cơ sở dữ liệu
- Chiến lược này hơi khó để làm đúng nhưng có thể rất mạnh và nhanh. (tham khảo học thuyết chính thức_doc ... nhưng chưa đọc thêm giải thích)
- ORM phải làm ít công việc hơn (so với hai cách làm trước đây) và do đó sẽ có hiệu suất tốt hơn.
thông tin khác
- tất cả 3 cách làm đó đều được triển khai trên các thực thể quan hệ nhà thầu ( phải không ??? )
- sử dụng cascade = {"remove"} hoàn toàn bỏ qua bất kỳ khóa ngoại nào onDelete = CASCADE. (tham khảo học thuyết_official_doc )
VÍ DỤ VỀ CÁCH SỬ DỤNG NÓ TRONG MÃ
- orphanRemoval và cascade = {"remove"} được xác định trong lớp thực thể đảo ngược.
- ondelete = "CASCADE" được xác định trong thực thể chủ sở hữu
- bạn cũng có thể chỉ cần viết @ORM \ JoinColumn (onDelete = "CASCADE") và để học thuyết xử lý tên cột
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;