Doctrine ManyToMany about repeated entry failure on the same entity

I need to associate the same field with different parameters.

ManyToMany:

/** * @ORM\ManyToMany(targetEntity="BRCN\TaxonomyBundle\Entity\Taxonomy", mappedBy="genderCategories") */ private $genders; /** * @ORM\ManyToMany(targetEntity="BRCN\TaxonomyBundle\Entity\Taxonomy", inversedBy="genders") * @ORM\JoinTable(name="menu_relations", * joinColumns={@ORM\JoinColumn(name="gender_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} * ) */ private $genderCategories; 

These variables use the same column name in the same id table.

When I look at the "menu_relations" table, I see two primary keys associated with my settings.

When I try to insert new entries, I get this error:

An exception occurred while executing 'INSERT INTO menu_relations (gender_id, category_id) VALUES (?,?)' With parameters [94, 1]:

SQLSTATE [23000]: Integrity constraint violation: 1062 Duplicate record '94 -1 'for key' PRIMARY '

Insert Values:

 if($request->isXmlHttpRequest()) { $categories = $request->request->get('category'); foreach($categories as $key => $value) { /** @var $gender \BRCN\TaxonomyBundle\Entity\Taxonomy */ $gender = $em->find('BRCNTaxonomyBundle:Taxonomy', $key); if($gender) { foreach($value as $category) { $category = $em->find('BRCNTaxonomyBundle:Taxonomy', $category); $gender->addGenderCategory($category); $em->persist($gender); } $em->flush(); } } return JsonResponse::create([ 'status' => true, 'message' => 'İlişkilendirme Başarılı' ]); } 
+7
sql php symfony doctrine2
source share
1 answer

You can use Doctrine indexed associations to avoid adding duplicate relationships.

The code below indexes $genderCategories by category_id , so it will never contain more than one category with the same identifier.

Note the indexBy property in annotations.

 /** * @ORM\ManyToMany(targetEntity="BRCN\TaxonomyBundle\Entity\Taxonomy", inversedBy="genders", indexBy="id") * @ORM\JoinTable(name="menu_relations", * joinColumns={@ORM\JoinColumn(name="gender_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} * ) */ private $genderCategories; public addGenderCategory($category) { $this->genderCategories[$category->getId()] = $category; } 

Sidenote

I suggest pulling a persist call from your loop to improve performance.

 foreach($value as $category) { $category = $em->find('BRCNTaxonomyBundle:Taxonomy', $category); $gender->addGenderCategory($category); } $em->persist($gender); 
+9
source share

All Articles