Symfony2 和 Doctrine:一对多与联接表孤立删除



我有一个实体"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")

相关内容

  • 没有找到相关文章

最新更新