2016-06-02 7 views
1

Ich habe eine Entität, "AnnualReport", die eine Sammlung von Entitäten akzeptiert, "AnnualReportStaffing". Ein Jahresbericht enthält vier verschiedene Staffing-Abschnitte und damit vier dieser Sammlungen (ArrayCollection). Da ich eine traditionelle Eins-zu-viele-Beziehung nicht verwenden kann, muss ich One-to-Many mit Join Table wie beschrieben here verwenden.Symfony2 und Doctrine: Eins-zu-Viele mit Join Table Orphan Removal

zum Beispiel ist einer meiner Personal Sammlungen So definiert als solche in meiner FTSBERICHT Klasse:

/** 
* @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist"}, orphanRemoval=true, fetch="LAZY") 
* @ORM\JoinTable(name="annualreports_staffingtenure", 
*  joinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")}, 
*  ) 
*/ 
private $staffing; 

Nun, wenn es an der Zeit zu löschen eine FTSBERICHT kommt, Lehre entfernt die Beziehung zwischen dem Bericht und dem Personal innerhalb der Join-Tabelle, aber es entfernt NICHT die damit verbundenen AnnualReportStaffing-Entitäten. Ich habe versucht, cascade = {"remove"} hinzuzufügen, aber ich bekomme eine Fremdschlüsselverletzung, weil versucht wird, die Staffing-Entität zu entfernen, bevor die Join-Tabellenzuordnung gelöscht wird.

Was ist der beste Weg, um die verwaisten Staffing-Entitäten zu entfernen? Offensichtlich ist orphanRemoval = true nicht die Antwort.

Antwort

0

Sie können wie folgt versuchen:

@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
+0

Dies wurde für die Berichtsspalte benötigt, machte aber keinen Unterschied für die Löschung von verwaisten Staffing-Entitäten. – Ravioli87

1

Die Lösung besteht darin, dass Sie zuerst die Personal Entität aus der ORM lösen müssen, so ist es nicht mehr verfolgt. Nachdem es getrennt wurde, kann es ohne die Fremdschlüsselverletzung entfernt werden. Außerdem musste in der Spalte "inverse" onDelete = "CASCADE" gesetzt sein, um den Bericht selbst zu entfernen. Ich bin nicht überzeugt, dass dies die sicherste oder eleganteste Lösung ist, aber es scheint für diesen speziellen Anwendungsfall zu funktionieren.

/** 
* @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY") 
* @ORM\JoinTable(name="annualreports_staffingtenure", 
*  joinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id", onDelete="CASCADE")}, 
*  ) 
*/