onetomany one manytoone manytomany many delete symfony doctrine entity cascade

one - symfony cascade persist



cascade={"remove"} VS orphanRemoval=true VS ondelete="CASCADE (1)

onDelete="CASCADE" es administrado por la base de datos en sí. cascade={"remove"} es administrado por la 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 es realizada por el servidor de la base de datos y no por Doctrine. Con cascade={"remove"} doctrine tiene que administrar la entidad en sí misma y realizará comprobaciones adicionales para ver si no tiene otras entidades propietarias. Cuando no existe otro, eliminará la entidad. Pero esto crea sobrecarga.

cascade = {"eliminar"}

  • la entidad en el lado inverso se elimina cuando la entidad del lado propietario es. Incluso si estás en una gran cantidad de otras entidades propietarias. No, si la entidad es propiedad de otra cosa. No será eliminado.
  • se debe usar en la colección (por lo tanto, 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 AND y ya no está conectada a ninguna otra entidad del lado propietario. No exactamente, esto hace que la doctrina se comporte como si no fuera propiedad de otra entidad y, por lo tanto, la elimina.
  • 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 foránea IN THE DATABASE
  • Esta estrategia es un poco difícil de entender, pero puede ser muy poderosa y rápida. (esta es una cita del tutorial oficial de doctrina ... pero no he visto mucha más explicación)
  • ORM tiene que hacer menos trabajo (en comparación con las dos formas anteriores de hacer) y, por lo tanto, debería tener un mejor rendimiento.

Traté de recopilar poca información sobre las siguientes formas de eliminar automáticamente la entidad hijo cuando se elimina una entidad principal. Parece que la forma más común es usar una de esas tres anotaciones: cascade = {"remove"} OR orphanRemoval = true O ondelete = "CASCADE" .

Estoy un poco confundido sobre el tercero: ondelete = "CASCADE" , ya que la explicación en la doctrina es muy escasa en la documentación oficial) y me encantaría que alguien pudiera confirmarme la siguiente información que reuní y entiendo de mi investigación sobre el red y experiencia ...

QUE HACE

cascade = {"eliminar"}
==> la entidad en el lado inverso se elimina cuando la entidad del lado propietario es. Incluso si estás en una gran cantidad de otras entidades propietarias.
- debe usarse en la colección (por lo tanto, 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 AND 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 foránea en la base de datos
- Esta estrategia es un poco difícil de acertar pero puede ser muy poderosa y rápida. (ref. doctrine official_doc ... pero no ha leído más explicaciones)
- ORM tiene que hacer menos trabajo (en comparación con las dos formas anteriores de hacer) y, por lo tanto, debería tener un mejor rendimiento.

otra información
- todas esas 3 formas de hacer se implementan en entidades de relación bidireccional ( ¿verdad? )
- El uso de cascade = {"remove"} omite por completo cualquier clave externa onDelete = CASCADE. (ref. doctrine_official_doc )

EJEMPLO SOBRE CÓMO UTILIZARLO EN EL CÓDIGO

  • orphanRemoval y cascade = {"remove"} se definen en la clase de entidad inversa.
  • ondelete = "CASCADE" se define 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 = true

/** * @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true) */ protected $Phonenumbers

onDelete = "CASCADE"

/** * @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers") * @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE") */ protected $contact;