Ich habe versucht, einige Informationen über die folgenden Methoden zum automatischen Löschen einer untergeordneten Entität zu sammeln, wenn eine übergeordnete Entität gelöscht wird. Scheint, dass der häufigste Weg darin besteht, eine dieser drei Anmerkungen zu verwenden: cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE" .
Ich bin etwas verwirrt über die dritte: ondelete = "CASCADE" , da Erklärungen in der offiziellen Dokumentation der Doktrin zu dieser sehr selten sind) und ich würde mich freuen , wenn mir jemand die folgenden Informationen bestätigen könnte, die ich aus meinen Recherchen über die Netz und Erfahrung ...
WAS ES MACHT
cascade = {"remove"}
==> Die Entität auf der inversen Seite wird gelöscht, wenn die Entität auf der Besitzerseite ist. Selbst wenn Sie in einer Vielzahl von Unternehmen mit anderen Eigentümern sind.
- sollte bei der Erfassung verwendet werden (also in der OneToMany- oder ManyToMany-Beziehung)
- Implementierung im ORM
orphanRemoval = true
==> Die Entität auf der inversen Seite wird gelöscht, wenn die Entität auf der Besitzerseite UND ist und nicht mehr mit einer anderen Entität auf der Besitzerseite verbunden ist. (Ref. Doctrineicial_doc
- Implementierung im ORM
- kann mit OneToOne, OnetoMany oder ManyToMany verwendet werden
onDelete = "CASCADE"
==> Dadurch wird On Delete Cascade zur Fremdschlüsselspalte in der Datenbank hinzugefügt.
Diese Strategie ist etwas schwierig zu korrigieren, kann jedoch sehr leistungsfähig und schnell sein. (Ref. Doctrine offiziell_doc ... aber ich habe keine weiteren Erklärungen gelesen)
- ORM muss weniger Arbeit leisten (im Vergleich zu den beiden vorherigen Methoden) und sollte daher eine bessere Leistung haben.
andere Informationen
- all diese drei Methoden werden auf bidirektionalen Beziehungsentitäten implementiert ( rechts ??? )
- mit cascade = {"remove"} wird jeder Fremdschlüssel onDelete = CASCADE vollständig umgangen. (Ref. Doctrine_official_doc )
BEISPIEL FÜR DIE VERWENDUNG IM CODE
- orphanRemoval und cascade = {"remove"} werden in der inversen Entitätsklasse definiert.
- ondelete = "CASCADE" ist in der Eigentümerentität definiert
- Sie können auch einfach @ORM \ JoinColumn (onDelete = "CASCADE") schreiben und die Spalte die Spaltennamen behandeln lassen
cascade = {"remove"}
/**
* @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;
Antworten:
onDelete="CASCADE"
wird von der Datenbank selbst verwaltet.cascade={"remove"}
wird von der Lehre verwaltet.onDelete="CASCADE"
ist schneller, weil die Operationen auf Datenbankebene statt durch Doktrin ausgeführt werden. Das Entfernen wird vom Datenbankserver und nicht von Doctrine durchgeführt. Withcascade={"remove"}
Doctrine muss die Entität selbst verwalten und führt zusätzliche Überprüfungen durch, um festzustellen, ob sie keine anderen besitzenden Entitäten hat. Wenn keine andere vorhanden ist, wird die Entität gelöscht. Dies schafft jedoch Overhead.cascade = {"remove"}
orphanRemoval = "true"
onDelete = "CASCADE"
quelle