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