Symfony2和Doctrine:一对多的连接表孤立删除

时间:2016-06-02 19:56:49

标签: symfony doctrine-orm persistence orphaned-objects

我有一个实体," 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不是答案。

2 个答案:

答案 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")