relations onetomany manytoone manytomany foreign delete php doctrine cascade

php - onetomany - symfony cascade options



Comprender las operaciones de Doctrine Cascade (1)

Quiero verificar mi comprensión de las operaciones en cascada en las asociaciones de Doctrine. Para el propósito de esta pregunta, tengo dos modelos: Customer y Insuree .

Si defino una relación de muchos a muchos entre un Customer y Insuree y establezco una cascade{"all"} , entiendo que esto:

  • Agregar una nueva aseguradora a un cliente persistirá en esta aseguradora y creará una asociación en la tabla de unión.
  • La eliminación de un asegurado de la colección separará al asegurado del cliente y separará al cliente del asegurado.
  • Al eliminar al cliente, se eliminarán todas las aseguradoras asociadas con el cliente.

Esta es la definición de la asociación en 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;

Si defino la relación inversa de muchos a muchos entre un Insuree y Customer y establezco una cascade{"all"} , entiendo que esto:

  • Agregar un nuevo cliente a una aseguradora persistirá en este cliente y creará una asociación en la tabla de unión.
  • La eliminación de un cliente de la colección separará al cliente del asegurado y separará al asegurado del cliente.
  • Al eliminar al asegurado se eliminarán todos los clientes asociados con él.

Esta es la definición de la asociación en Insurees .

/** * @ORM/ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) */ protected $customers;

Si luego defino la relación como para continuar en cascada, fusionar y separar - eliminar al asegurado no eliminará a todos los clientes asociados - ¿solo eliminará las asociaciones entre el asegurado y sus clientes?

/** * @ORM/ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) */ protected $customers;


persistir y eliminar

Tiene razón acerca de cascade={"persist"} lo que significa que la entidad persistente A, Doctrine también persistirá en todas las entidades B en la Colección.

También tienes razón sobre cascade={"remove"} lo que significa que al eliminar la entidad A, Doctrine también eliminará todas las entidades B de la Colección.
Pero dudo que alguna vez quieras usar esto en una asociación ManyToMany, porque cuando eliminas la entidad A que conecta esta operación con todas las entidades B, esas entidades B pueden estar asociadas a otras entidades A.

separar y fusionar

No estás en lo correcto acerca de cascade={"detach"} y cascade={"merge"} :

Agregar / eliminar entidades de la Colección es algo que debe hacer (en su código). Lea sobre eso here .

Separar significa que separe una entidad del EntityManager. El EntityManager ya no administrará esa entidad. Esto hace que una entidad separada sea igual a una entidad recién instanciada, excepto que ya está en la base de datos (pero usted no lo sabe).

En otras palabras: cascade={"detach"} significa que al separar la entidad A, Doctrine también separará todas las entidades B en la Colección.

Merge es lo opuesto a detach : fusionará una entidad separada de nuevo en EntityManager.
Tenga en cuenta que merge() realmente devolverá un nuevo objeto administrado, el objeto separado que le pasó permanece sin administrar.