在一个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:外键约束失败(
uniski
。product_rates
, CONSTRAINTFK_15A90A8FBC999F9F
FOREIGN KEY(rate_id
)参考price_rate
(id
))
为什么不先尝试删除已连接的表行?我尝试在联接表列中添加onDelete
语句,但它没有用。
这是一种单向关系,因为 PriceRate 被其他实体使用,因此我使用的是ManyToMany关系。
它的唯一工作方式是在删除实体之前清除子实体的ArrayCollection,如下所示:
$product->removeAllRate(); //it does this: $this->rates->clear();
$em->remove($product);
$em->flush();
谢谢!
答案 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