1

我有一个实体“AnnualReport”,它接受实体集合“AnnualReportStaffing”。年度报告有四个不同的人员配备部分,因此有四个这样的集合(ArrayCollection)。由于我不能使用传统的一对多关系,因此我必须使用带联接表的一对多,如此所述。

因此,例如,我的 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={"remove"},但我收到外键违规,因为它试图在删除连接表关联之前删除 Staffing 实体。

删除孤立的 Staffing 实体的最佳方法是什么?显然 orphanRemoval=true 不是答案。

4

2 回答 2

1

解决方案是您必须首先将 Staffing 实体从 ORM 中分离出来,以便不再对其进行跟踪。分离后,可以在不违反外键的情况下将其删除。此外,反列必须设置 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")},
 *      )
 */
于 2016-06-02T20:06:13.687 回答
0

你可以这样尝试:

@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
于 2016-06-02T20:03:22.453 回答