删除ManyToMany Doctrine2关系

时间:2017-08-08 11:17:19

标签: symfony doctrine-orm doctrine many-to-many

在一个Doctrine实体中,我有这样的配置:

/**
 * @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_rate表,而不是连接表,因此我收到以下错误:

  

完整性约束违规:1451无法删除或更新父级   row:外键约束失败(uniskiproduct_rates,   CONSTRAINT FK_15A90A8FBC999F9F FOREIGN KEY(rate_id)参考   price_rateid))

为什么不先尝试删除已连接的表行?我尝试在联接表列中添加onDelete语句,但它没有用。

这是一种单向关系,因为 PriceRate 被其他实体使用,因此我使用的是ManyToMany关系。

它的唯一工作方式是在删除实体之前清除子实体的ArrayCollection,如下所示:

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我遇到了同样的问题,具体问题是:

  

这是单向关系,因为PriceRate由其他实体使用,因此我使用的是ManyToMany关系。

我可以通过在两个joinColumns上添加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=在这里更具限制性,我在unique=true上有inverseJoinColumns,而我不需要orphanRemoval

相关问题