2017-08-08 1 views
0

Dans une entité Doctrine J'ai cette configuration:Supprimer ManyToMany Doctrine2 relation

/** 
* @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; 

Lorsque je supprime l'entité tente de supprimer la première table price_rate, au lieu de la table jointe si je reçois l'erreur suivante :

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))

Pourquoi n'essaie-t-il pas d'abord de supprimer les lignes de la table jointes? J'ai essayé d'ajouter des instructions onDelete sur les colonnes de la table de jointure, mais cela n'a pas fonctionné.

Ceci est une relation unidirectionnelle car PriceRate est utilisé par d'autres entités, par conséquent j'utilise une relation ManyToMany.

La seule façon dont cela fonctionne est avant de retirer l'entité est d'effacer la ArrayCollection des entités enfants comme ceci:

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

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

Merci!

+0

ce poste m'a aidé à: https://stackoverflow.com/questions/14257004/doctrine2-symfony2-cascading-remove-integrity-constraint-violation-1451. Salutations – Albeis

Répondre

0

Dans l'entité, vous devez également spécifier la relation ManyToMany. C'est la raison. Exemple:

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

Peut-être c'est pourquoi il n'y a pas de moyen plus court de le faire, je dois d'abord supprimer toutes les entités enfants. Je ne peux pas ajouter la relation de l'autre côté parce que les taux sont partagés entre d'autres types d'entités. Si les tarifs ne sont utilisés que par des produits, je pourrais utiliser votre solution. Une partie de l'issue de l'archétype, si je ne le change pas, enlever les entités d'enfant d'abord est la manière olny, qui n'est pas si mauvaise en ce moment. –