cascade = {“remove”} VS huérfanoRemoval = true VS ondelete = "CASCADE

Intenté reunir 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 usar una de esas tres anotaciones:cascada = {"eliminar"} OorphanRemoval = true Oondelete = "CASCADA".

soyun poco confuso sobre el tercero:ondelete = "CASCADA", ya que la explicación en la documentación de la documentación oficial sobre esto es muy escasa) y me encantaría que alguien pudieraconfirmame la siguiente información Reuní y entendí de mi investigación en la red y experiencia ...

QUE HACE

cascada = {"eliminar"}
==> la entidad en el lado inverso se elimina cuando la entidad del lado propietario es. Incluso si está en una gran cantidad con otra entidad secundaria propietaria.
- 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 Y ya no está conectada a ninguna otra entidad del lado propietario. (árbitro.doctrina official_doc - implementación en el ORM
- se puede usar con OneToOne, OnetoMany o ManyToMany

onDelete = "CASCADA"
==> esto agregará On Delete Cascade a la columna de clave externa en la base de datos
- Esta estrategia es un poco complicada, pero puede ser muy poderosa y rápida. (árbitro.doctrina 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 hacer se implementan en entidades de relación bidireccional (¿¿¿derecho???)
- usando cascade = {"remove"} omite completamente cualquier clave foránea onDelete = CASCADE. (árbitro.doctrina_oficial_doc)

EJEMPLO DE CÓMO USARLO EN CÓDIGOorphanRemoval y cascade = {"remove"} se definen en la clase de entidad inversa.ondelete = "CASCADE" se define en la entidad propietariaTambién puede escribir @ORM \ JoinColumn (onDelete = "CASCADE") y dejar que la doctrina maneje los nombres de las columnas

cascada = {"eliminar"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

orphanRemoval = true

/**
* @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 a la pregunta(1)

Su respuesta a la pregunta