2014-07-07 6 views
46

Ich möchte mein Verständnis von Kaskadenoperationen in Doctrine-Zuordnungen überprüfen. Für den Zweck dieser Frage habe ich zwei Modelle: Customer und Insuree.Verständnis von Cascade-Operationen in Doctrine

Wenn ich viele zu viele Beziehung zwischen einem Customer und Insuree und setzen cascade{"all"} definieren, ich verstehe, dass dies:

  • ein neues Versicherungsnehmers an einen Kunden hinzufügen, wird dieses Versicherungsnehmers bestehen bleiben und eine Zuordnung in der erstellen Tabelle beitreten.
  • Das Entfernen eines Versicherten aus der Sammlung löst den Versicherten vom Kunden ab und trennt den Kunden vom Versicherten.
  • Durch das Löschen des Kunden werden alle mit dem Kunden verbundenen Versicherten gelöscht.

Dies ist die Definition der Assoziation auf Customers.

/** 
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"}) 
* @ORM\JoinTable(name="customer_insuree", 
*  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")} 
*) 
*/ 
protected $insurees; 

Wenn ich die inverse viele zu viele Beziehung zwischen einem Insuree und Customer und setzen cascade{"all"} definieren, ich verstehe, dass dies:

  • einen neuen Kunden zu einem Versicherungsnehmers Hinzufügen wird diesen Kunden bestehen bleiben und erstellen eine Verknüpfung in der Join-Tabelle.
  • Das Entfernen eines Kunden aus der Sammlung löst den Kunden vom Versicherten und trennt den Versicherten vom Kunden.
  • Durch das Löschen des Versicherten werden alle damit verbundenen Kunden gelöscht.

Dies ist die Definition der Assoziation auf Insurees.

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) 
*/ 
protected $customers; 

Wenn ich die Beziehung dann definieren, wie beharren Kaskade auf, verschmelzen und trennen - der Versicherte das Löschen aller zugehörigen Kunden nicht löschen - es wird die Verbindungen zwischen den Versicherten und ihren Kunden nur entfernen?

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) 
*/ 
protected $customers; 
+1

Können Sie nicht überprüfen, ob Ihr Verständnis der Kaskadierungsbeziehungen korrekt ist, indem Sie einige "Kunden" und "Versicherer" erstellen und mit dem Löschen/Hinzufügen von Datensätzen beginnen? – undefined

Antwort

103

bestehen &

Sie sind richtig entfernen zu cascade={"persist"} was bedeutet, dass persistierende Einheit A, Lehre auch alle B Einheiten bestehen bleiben wird in der Sammlung.

Sie sind auch korrekt über cascade={"remove"}, was bedeutet, dass das Entfernen von Entität A, Doctrine auch alle B-Entitäten in der Sammlung entfernt.
Aber ich bezweifle, dass Sie jemals dies in einer ManyToMany-Verknüpfung verwenden möchten, da beim Entfernen von Entität A, die diese Operation auf alle B-Entitäten kaskadiert, diese B-Entitäten anderen A-Entitäten zugeordnet werden können.

lösen & merge

Sie sind nicht korrekt über cascade={"detach"} und cascade={"merge"}:

Hinzufügen/Entfernen von Einheiten aus der Sammlung etwas Sie Bedarf (im Code) zu tun. Lesen Sie darüber here.

Trennen bedeutet, dass Sie eine Entity vom EntityManager lösen. Der EntityManager verwaltet diese Entität nicht mehr. Dadurch wird eine abgetrennte Entität gleich wie eine neu instanziierte Entität, mit der Ausnahme, dass sie bereits in der Datenbank vorhanden ist (Sie haben dies jedoch dem EntityManager nicht bewusst gemacht).

Mit anderen Worten: cascade={"detach"} bedeutet, dass das Trennen von Entität A, Doctrine auch alle B-Entitäten in der Sammlung trennt.

Merge ist das Gegenteil von lösen: Sie erhalten eine freistehende Einheit wieder in die EntityManager verschmelzen.
Beachten Sie, dass merge() tatsächlich ein neues verwaltetes Objekt zurückgibt, das abgelöste Objekt, das an es übergeben wurde, bleibt unmanaged.