Symfony 删除多个Doctrine2关系

Symfony 删除多个Doctrine2关系,symfony,doctrine-orm,doctrine,many-to-many,Symfony,Doctrine Orm,Doctrine,Many To Many,在条令实体中,我有以下配置: /** * @var \Doctrine\Common\Collections\ArrayCollection * @ORM\ManyToMany(targetEntity="PriceRate", cascade={"all"}, orphanRemoval=true) * @ORM\JoinTable(name="product_rates", * joinColumns={@ORM\JoinColumn(name="product_id",refe

在条令实体中,我有以下配置:

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * @ORM\ManyToMany(targetEntity="PriceRate", cascade={"all"}, orphanRemoval=true)
 * @ORM\JoinTable(name="product_rates",
 *   joinColumns={@ORM\JoinColumn(name="product_id",referencedColumnName="id")},
 *   inverseJoinColumns={@ORM\JoinColumn(name="rate_id",referencedColumnName="id")})
 */
protected $rates;
当我删除实体时,它会首先尝试删除
price\u rate
表,而不是连接的表,因此我得到以下错误:

完整性约束冲突:1451无法删除或更新父项 行:外键约束失败(
uniski
product\u rates
, 约束
FK_15A90A8FBC999F9F
外键(
rate_id
)引用
price\u rate
id

为什么不先尝试删除连接的表行?我尝试在联接表列上添加
onDelete
语句,但没有成功

这是一个单向关系,因为其他实体使用的是价格,因此我使用了多个关系

唯一可行的方法是在删除实体之前清除子实体的ArrayCollection,如下所示:

$product->removeAllRate(); //it does this: $this->rates->clear();

$em->remove($product);
$em->flush();

谢谢

在实体中,还必须指定多个关系。这就是原因。例如:

/**
 * @ORM\ManyToMany(targetEntity="Product", mappedBy="rates")
 */
private $products;

在实体中,还必须指定多个关系。这就是原因。例如:

/**
 * @ORM\ManyToMany(targetEntity="Product", mappedBy="rates")
 */
private $products;

我也有同样的问题,具体如下:

这是一个单向关系,因为其他实体使用PriceRate,因此我使用了多个关系

我可以在两个列上添加
onDelete=“cascade”
所以我的看起来是这样的:

 * @ORM\ManyToMany(targetEntity="PriceRate", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="product_rates",
 *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="cascade")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="rate_id", referencedColumnName="id", unique=true, onDelete="cascade")}
 * )

请注意,我有一些不同之处:我的
cascade=
在这里更具限制性,我在
inversejoin列上有一个
unique=true
,我不需要删除

,我也有同样的问题,具体如下:

这是一个单向关系,因为其他实体使用PriceRate,因此我使用了多个关系

我可以在两个列上添加
onDelete=“cascade”
所以我的看起来是这样的:

 * @ORM\ManyToMany(targetEntity="PriceRate", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="product_rates",
 *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="cascade")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="rate_id", referencedColumnName="id", unique=true, onDelete="cascade")}
 * )

请注意,我有一些不同之处:我的
cascade=
在这里更具限制性,我在
inversejoin列上有一个
unique=true
,我不需要删除

这篇文章对我有帮助:。这篇文章对我很有帮助。也许这就是为什么没有更短的方法来做这件事,我必须首先删除所有的子实体。我无法添加另一方关系,因为费率在其他类型的实体之间共享。如果价格仅用于产品,我可以使用您的解决方案。考古学问题的一部分,如果我不改变它,首先移除子实体是olny的方法,目前还不是很糟糕。可能这就是为什么没有更短的方法来做这件事,我必须首先移除所有子实体。我无法添加另一方关系,因为费率在其他类型的实体之间共享。如果价格仅用于产品,我可以使用您的解决方案。如果我不改变它的话,首先移除子实体是olny的方法,目前还不错。