Я попытался собрать немного информации о следующих способах автоматического удаления дочернего объекта при удалении родительского объекта. Кажется, что наиболее распространенным способом является использование одной из трех аннотаций: cascade = { "remove" } ИЛИ orphanRemoval = true ИЛИ ondelete = "CASCADE" strong > .
Я немного озадачен третьим: ondelete = "CASCADE" , так как объяснение в доктрине официальной документации об этом очень мало), и мне было бы очень приятно, если бы кто-то смог подтвердить меня следующая информация Я собрал и понял из своих исследований в сети и опыте...
ЧТО ЭТО
каскадного = { "удалить" }
== > объект на обратной стороне удаляется, когда объект-владелец принадлежит. Даже если вы находитесь в многогосударстве с другим лицом, владеющим стороной.
- следует использовать для сбора (так в отношениях OneToMany или ManyToMany)
- реализация в ORM
orphanRemoval = истина
== > сущность на обратной стороне удаляется, когда объект-владеющая сторона И еще не подключен к какой-либо другой стороне, принадлежащей стороне. (ссылка doctrine official_doc
- реализация в ORM
- может использоваться с OneToOne, OnetoMany или ManyToMany
OnDelete = "КАСКАД"
== > это добавит On Delete Cascade в столбец внешнего ключа в базе данных
- Эта стратегия немного сложна, чтобы получить право, но может быть очень мощной и быстрой. (ссылка doctrine official_doc... но не читайте больше объяснений)
- ORM должен делать меньше работы (по сравнению с двумя предыдущими способами) и поэтому должен иметь лучшую производительность.
другая информация
- все эти три способа выполнения реализованы на двунаправленных объектах связи (справа???)
- использование cascade = { "remove" } полностью обходит любой внешний ключ onDelete = CASCADE. (ссылка doctrine_official_doc)
ПРИМЕР КАК ИСПОЛЬЗОВАТЬ ЭТО В КОДЕЛЕ
- orphanRemoval и cascade = { "remove" } определены в классе инвертированных сущностей.
- ondelete = "CASCADE" определяется в объекте владельца
- вы также можете просто написать @ORM\JoinColumn (onDelete = "CASCADE" ) и позволить доктрине обрабатывать имена столбцов
каскадного = { "удалить" }
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = истина
/**
* @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;