Я намагався зібрати небагато інформації про такі способи автоматичного видалення дочірньої сутності при видаленні батьківської сутності. Здається, найпоширенішим способом є використання однієї з цих трьох анотацій: cascade = {"remove"} АБО orphanRemoval = true АБО ondelete = "CASCADE" .
Я трохи заплутаний щодо третього: ondelete = "КАСКАД" , оскільки пояснення в офіційній документації доктрини щодо цього є дуже мізерними), і я був би дуже радий, якби хтось міг підтвердити мені наступну інформацію, яку я зібрав і зрозумів із моїх досліджень щодо мережа та досвід ...
ЩО ЦЕ РОБИТЬ
cascade = {"remove"}
==> сутність на зворотному боці видаляється, коли сутність, що володіє стороною, є. Навіть якщо ви перебуваєте в багатьох сім'ях з іншими сторонами, що володіють.
- повинен використовуватися для збору (так у відносинах OneToMany або ManyToMany)
- реалізація в ORM
orphanRemoval = true
==> сутність на зворотному боці видаляється, коли сутність, що володіє, є І І вона більше не підключена до жодної іншої сторони, що володіє. (посилання на доктрину official_doc
- реалізація в ORM
- може використовуватися з OneToOne, OnetoMany або ManyToMany
onDelete = "CASCADE"
==> це додасть On Delete Cascade до стовпця зовнішнього ключа в базі даних
- Ця стратегія трохи складна для правильного вибору, але може бути дуже потужною та швидкою. (посилання на доктрину official_doc ... але не читав більше пояснень)
- ORM повинен виконувати менше роботи (порівняно з двома попередніми способами виконання), а отже, повинен мати кращу продуктивність.
інша інформація
- усі ці 3 способи здійснення реалізовані на двонаправлених сутностях відносин ( право ??? )
- за допомогою cascade = {"remove"} повністю обходить будь-який зовнішній ключ onDelete = CASCADE. (посилання doctrine_official_doc )
ПРИКЛАД, ЯК ВИКОРИСТОВУВАТИ ЦЕ В КОДІ
- orphanRemoval і cascade = {"remove"} визначені в інверсованому класі сутності.
- ondelete = "КАСКАД" визначено в сутності власника
- Ви також можете просто написати @ORM \ JoinColumn (onDelete = "CASCADE") і дозволити доктрині обробляти імена стовпців
каскад = {"видалити"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = true
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "КАСКАД"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;