我有一个实体," AnnualReport",它接受一组实体," AnnualReportStaffing"。年度报告有四个不同的人员配置部分,因此有四个这样的集合(ArrayCollection)。由于我不能使用传统的一对多关系,因此我必须按照here所述使用一对多的连接表。
因此,例如,我的Staffing集合之一在我的AnnualReport类中定义为:
/**
* @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;
现在,当需要删除AnnualReport时,Doctrine会删除报表与连接表中的Staffing之间的关系,但它不会删除关联的AnnualReportStaffing实体。我尝试添加cascade = {"删除"}但是我得到了外键违规,因为它试图在删除连接表关联之前删除Staffing实体。
删除孤立的Staffing实体的最佳方法是什么?显然orphanRemoval = true不是答案。
答案 0 :(得分:1)
解决方案是您必须首先从ORM中分离Staffing实体,以便不再跟踪它。分离后,可以在不违反外键的情况下将其删除。此外,反向列必须设置onDelete =“CASCADE”才能删除报告本身。我并不认为这是最安全或最优雅的解决方案,但它似乎适用于这个特定的用例。
/**
* @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")},
* )
*/
答案 1 :(得分:0)
您可以尝试这样:
@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")