我有一个实体"YearualReport",它接受一组实体,"YearualReportStaffing"。年度报告有四个不同的人员配置部分,因此有四个这样的集合(ArrayCollection)。由于我不能使用传统的一对多关系,因此必须对联接表使用一对多,如此处所述。
因此,例如,我的一个人员配置集合在我的年度报告类中被定义为这样:
/**
* @ORMManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist"}, orphanRemoval=true, fetch="LAZY")
* @ORMJoinTable(name="annualreports_staffingtenure",
* joinColumns={@ORMJoinColumn(name="staffing_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="annualreport_id", referencedColumnName="id")},
* )
*/
private $staffing;
现在,当需要删除年度报告时,Doctrine 会删除联接表中的报告与人员配备之间的关系,但不会删除关联的年度报告人员配备实体。 我尝试添加 cascade={"remove"},但我收到外键冲突,因为它试图在删除联接表关联之前删除人员配备实体。
删除孤立的人员配备实体的最佳方法是什么?显然,orphanRemoval=true不是答案。
解决方案是您必须首先将人员配备实体与 ORM 分离,以便不再对其进行跟踪。分离后,可以在不违反外键的情况下将其删除。此外,反转列必须设置 onDelete="CASCADE" 才能删除报表本身。我并不肯定这是最安全或最优雅的解决方案,但它似乎适用于这个特定的用例。
/**
* @ORMManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY")
* @ORMJoinTable(name="annualreports_staffingtenure",
* joinColumns={@ORMJoinColumn(name="annualreport_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="staffing_id", referencedColumnName="id", onDelete="CASCADE")},
* )
*/
你可以这样尝试:
@ORMJoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")