Ho provato a raccogliere poche informazioni su coloro che seguono il modo per eliminare automaticamente l'entità figlio quando viene eliminata un'entità padre. Sembra che il modo più comune sia usare una di queste tre annotazioni: cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE" .
Sono un po 'confuso riguardo al terzo: ondelete = "CASCADE" , poiché le spiegazioni nella documentazione ufficiale di questa dottrina sono molto scarse) e mi piacerebbe se qualcuno potesse confermarmi le seguenti informazioni che ho raccolto e compreso dalla mia ricerca sul rete ed esperienza ...
COSA FA
cascade = {"remove"}
==> l'entità sul lato opposto viene eliminata quando l'entità del lato proprietario è. Anche se sei in molti con altre entità secondarie proprietarie.
- dovrebbe essere utilizzato nella raccolta (quindi nella relazione OneToMany o ManyToMany)
- implementazione nell'ORM
orphanRemoval = true
==> l'entità sul lato inverso viene eliminata quando l'entità del lato proprietario è E non è più collegata a nessun'altra entità laterale proprietaria. (rif. doctrine official_doc
- implementazione
nell'ORM - può essere utilizzato con OneToOne, OnetoMany o ManyToMany
onDelete = "CASCADE"
==> questo aggiungerà On Delete Cascade alla colonna della chiave esterna nel database
- Questa strategia è un po 'complicata da mettere a punto ma può essere molto potente e veloce. (rif. doctrine official_doc ... ma non ho letto altre spiegazioni)
- ORM deve fare meno lavoro (rispetto ai due precedenti modi di fare) e quindi dovrebbe avere prestazioni migliori.
altre informazioni
- tutti questi 3 modi di fare sono implementati su entità di relazione bidirezionale ( giusto ??? )
- usando cascade = {"remove"} bypassa completamente qualsiasi chiave esterna onDelete = CASCADE. (rif. doctrine_official_doc )
ESEMPIO SU COME USARLO IN CODICE
- orphanRemoval e cascade = {"remove"} sono definiti nella classe di entità inversa.
- ondelete = "CASCADE" è definito nell'entità proprietario
- puoi anche scrivere @ORM \ JoinColumn (onDelete = "CASCADE") e lasciare che doctrine gestisca i nomi delle colonne
cascade = {"rimuovi"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = true
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "CASCATA"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;