Понимание каскадных операций Doctrine

Я хочу проверить свое понимание каскадных операций над ассоциациями 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() фактически вернет новый управляемый объект, удаленный объект, который вы передали ему, остается неуправляемым.