Я хочу проверить свое понимание каскадных операций над ассоциациями Doctrine. Для этого вопроса у меня есть две модели: Customer
и Insuree
.
Если я определяю много-много отношений между Customer
и Insuree
и устанавливаю cascade{"all"}
, я понимаю, что это будет:
Это определение ассоциации для Customers
.
/** * @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"}) * @ORM\JoinTable(name="customer_insuree", * joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")} * ) */ protected $insurees;
Если я определяю обратное много-много отношений между Insuree
и Customer
и устанавливаю cascade{"all"}
, я понимаю, что это будет:
Это определение ассоциации для Insurees
.
/** * @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) */ protected $customers;
Если я затем определю отношения, связанные с каскадом на persist, слияние и отсоединение – удаление инсайдера не удалит всех связанных с ним клиентов – это приведет к удалению ассоциаций между страхователем и его клиентами?
/** * @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) */ protected $customers;
сохранить и удалить
Вы правы в том, что cascade={"persist"}
означает, что сохраняющаяся сущность A, Doctrine также будет сохраняться в всех элементах B в коллекции.
Вы также верны о cascade={"remove"}
что означает, что удаление объекта A, Doctrine также удалит все элементы B в коллекции.
Но я сомневаюсь, что вы когда-нибудь захотите использовать это в ассоциации ManyToMany, потому что когда вы удаляете объект A, который каскадирует эту операцию ко всем объектам B, эти B-объекты могут быть связаны с другими объектами A.
отделить и объединить
Вы не правы относительно cascade={"detach"}
и cascade={"merge"}
:
Добавление / удаление объектов из коллекции – это то, что вам нужно сделать (в вашем коде). Читайте об этом здесь .
Отключение означает, что вы отсоединяете объект от EntityManager. EntityManager больше не будет управлять этим объектом. Это делает отдельный объект тем же, что и вновь созданный объект, за исключением того, что он уже находится в базе данных (но вы не знали об этом EntityManager).
Другими словами: cascade={"detach"}
означает, что отсоединение объекта A, Doctrine также отделит все элементы B в коллекции.
Слияние – это противоположность отделить : вы объедините отдельный объект обратно в EntityManager.
Обратите внимание, что merge()
фактически вернет новый управляемый объект, удаленный объект, который вы передали ему, остается неуправляемым.