2017-08-08 15 views
0

を削除しますので、私は次のエラーを取得する私は、この構成を持っているDoctrineのエンティティで多対多Doctrine2関係

/** 
* @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テーブルを削除しようとするエンティティを削除すると、代わりに結合されたテーブルの:

Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (uniski . product_rates , CONSTRAINT FK_15A90A8FBC999F9F FOREIGN KEY (rate_id) REFERENCES price_rate (id))

最初に結合テーブルの行を削除しようとしないのはなぜですか?私はonDeleteステートメントを結合テーブルの列に追加しようとしましたが、動作しませんでした。

PriceRateが他のエンティティによって使用されているため、これは単方向関係です。したがって、ManyToMany関係を使用しています。

それが動作する唯一の方法は、エンティティを削除する前にあるので、のような子実体のあるArrayCollectionをクリアすることです:

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

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

ありがとう!

+0

この記事は私に助け:https://stackoverflow.com/questions/14257004/doctrine2-symfony2-cascading-remove-integrity-constraint-violation-1451。よろしくご連絡ください – Albeis

答えて

0

エンティティでは、ManyToMany関係も指定する必要があります。これがまさにその理由だ。例:

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

これは、これを行うための短い方法がない理由は、私は最初にすべての子供のエンティティを削除する必要があります。他の種類のエンティティ間で料金が共有されているため、他の関係は追加できません。レートが製品によってのみ使用される場合、私はあなたのソリューションを使用することができます。 archetictureの問題の一部は、私がそれを変更しなければ、子供のエンティティを最初に取り除くのはオリー様です。それは現時点ではそれほど悪くありません。 –

関連する問題