Traté de recopilar poca información sobre las siguientes formas de eliminar automáticamente la entidad secundaria cuando se elimina una entidad principal. Parece que la forma más común es utilizar una de esas tres anotaciones: cascade = {"remove"} O orphanRemoval = true O ondelete = "CASCADE" .
estoy un poco confundido sobre el tercero: ondelete = "CASCADE" , ya que la explicación en la documentación oficial de la doctrina sobre este es muy escasa) y me encantaría que alguien pudiera confirmarme la siguiente información que recopilé y entiendo de mi investigación sobre el red y experiencia ...
QUE HACE
cascade = {"remove"}
==> la entidad en el lado inverso se elimina cuando la entidad del lado propietario es. Incluso si está en muchos casos con otra entidad del lado propietario.
- debe usarse en la colección (es decir, en la relación OneToMany o ManyToMany)
- implementación en el ORM
orphanRemoval = true
==> la entidad en el lado inverso se elimina cuando la entidad del lado propietario es Y ya no está conectada a ninguna otra entidad del lado propietario. (ref. doctrine official_doc
- implementación en el ORM
- se puede usar con OneToOne, OnetoMany o ManyToMany
onDelete = "CASCADE"
==> esto agregará On Delete Cascade a la columna de clave externa en la base de datos
. Esta estrategia es un poco complicada de hacer bien, pero puede ser muy poderosa y rápida. (ref. doctrine official_doc ... pero no he leído más explicaciones)
- ORM tiene que hacer menos trabajo (en comparación con las dos formas anteriores de hacerlo) y por lo tanto debería tener un mejor rendimiento.
otra información
- todas esas 3 formas de hacerlo se implementan en entidades de relación bidireccional ( ¿verdad ??? )
- usando cascade = {"remove"} omite por completo cualquier clave externa onDelete = CASCADE. (ref. doctrine_official_doc )
EJEMPLO DE CÓMO USARLO EN CÓDIGO
- orphanRemoval y cascade = {"remove"} se definen en la clase de entidad inversa.
- ondelete = "CASCADE" está definido en la entidad propietaria
- también puede escribir @ORM \ JoinColumn (onDelete = "CASCADE") y dejar que doctrine maneje los nombres de las columnas
cascade = {"eliminar"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = verdadero
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "CASCADA"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;
Respuestas:
onDelete="CASCADE"
es administrado por la propia base de datos.cascade={"remove"}
es administrado por doctrina.onDelete="CASCADE"
es más rápido porque las operaciones se realizan a nivel de base de datos en lugar de por doctrina. La eliminación la realiza el servidor de la base de datos y no Doctrine. Con lacascade={"remove"}
doctrina tiene que gestionar la propia entidad y realizará comprobaciones adicionales para ver si no tiene otras entidades propietarias. Cuando no exista otro, eliminará la entidad. Pero esto crea gastos generales.cascade = {"eliminar"}
orphanRemoval = "verdadero"
onDelete = "CASCADA"
fuente