ฉันพยายามรวบรวมข้อมูลบางอย่างเกี่ยวกับวิธีต่อไปนี้เพื่อลบเอนทิตีลูกโดยอัตโนมัติเมื่อเอนทิตีแม่ถูกลบ ดูเหมือนว่าวิธีที่พบมากที่สุดคือการใช้หนึ่งในบรรดาสามคำอธิบายประกอบ: น้ำตก = { "ลบ"}หรือorphanRemoval = trueหรือondelete = "น้ำตก"
ฉันสับสนเล็กน้อยเกี่ยวกับข้อที่สาม: ondelete = "CASCADE"เนื่องจากคำอธิบายในเอกสารอย่างเป็นทางการของหลักคำสอนเกี่ยวกับเรื่องนี้หายากมาก) และฉันจะชอบถ้ามีคนยืนยันข้อมูลต่อไปนี้ที่ฉันรวบรวมและเข้าใจจากการวิจัยของฉันเกี่ยวกับ สุทธิและประสบการณ์ ...
มันทำอะไร
cascade = {"remove"}
==> เอนทิตีทางด้านผกผันจะถูกลบเมื่อเอนทิตีฝั่งเจ้าของคือ แม้ว่าคุณจะอยู่ในหลายกลุ่มที่มีเอนทิตีด้านการเป็นเจ้าของอื่น
- ควรใช้ในการรวบรวม (ดังนั้นในความสัมพันธ์ OneToMany หรือ ManyToMany)
- การใช้งานใน ORM
orphanRemoval = true
==> เอนทิตีที่อยู่ด้านผกผันจะถูกลบเมื่อเอนทิตีฝั่งเจ้าของคือและไม่ได้เชื่อมต่อกับเอนทิตีฝั่งที่เป็นเจ้าของอื่น ๆ อีกต่อไป (อ้างอิง คำสอน official_doc
- การนำไปใช้ใน ORM
- สามารถใช้ได้กับ OneToOne, OnetoMany หรือ ManyToMany
onDelete = "CASCADE"
==> สิ่งนี้จะเพิ่ม On Delete Cascade ลงในคอลัมน์ Foreign Key ในฐานข้อมูล
- กลยุทธ์นี้ค่อนข้างยุ่งยากในการทำให้ถูกต้อง แต่อาจมีประสิทธิภาพและรวดเร็วมาก (อ้างอิง คำสอน official_doc ... แต่ยังไม่ได้อ่านคำอธิบายเพิ่มเติม)
- ORM ต้องทำงานน้อยลง (เมื่อเทียบกับวิธีการทำสองวิธีก่อนหน้านี้) ดังนั้นจึงควรมีประสิทธิภาพที่ดีขึ้น
ข้อมูลอื่น ๆ
- วิธีการทำทั้ง 3 วิธีนี้ถูกนำไปใช้กับเอนทิตีความสัมพันธ์แบบสองทิศทางแบบสองทิศทาง ( ใช่ไหม ??? )
- โดยใช้ cascade = {"remove"} โดยส่งคีย์แปลกปลอมใด ๆ บน (อ้างถึงdoctrine_official_doc )
ตัวอย่างวิธีการใช้งานในรหัส
- orphanRemoval และ cascade = {"remove"} ถูกกำหนดไว้ในคลาสเอนทิตีผกผัน
- ondelete = "CASCADE" ถูกกำหนดในเอนทิตีเจ้าของ
- คุณยังสามารถเขียน @ORM \ JoinColumn (onDelete = "CASCADE") และปล่อยให้หลักคำสอนจัดการชื่อคอลัมน์
น้ำตก = {"remove"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = จริง
/**
* @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;