2014-06-09 6 views
7

Devo associare lo stesso campo a parametri diversi.Doctrine ManyToMany su Same Entity Duplicate Entry Error

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; 

Queste variabili utilizzano lo stesso nome di colonna nella stessa tabella "id".

Quando guardo la tabella "menu_relations", vedo due chiavi primarie associate ai miei parametri.

Quando provo a inserire nuovi record, sto ottenendo questo errore:

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

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

valori Inserimento:

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ı' 
    ]); 
} 
+0

Si presenta l'errore per quel genere specifico ID = 94 e categoria ID = 1 o per qualsiasi inserto? Come si fa una query di inserimento? Hai un setter adatto per loro? – Javad

+0

No, proviene da dopo un inserto, nel secondo inserto intendo. Questo non fa la differenza. –

+0

Potresti fornire il codice nel controller in che modo si effettua la query di inserimento? – Javad

risposta

9

Si potrebbe approfittare della dottrina di indexed associations per evitare di aggiungere relazioni duplicate.

Il codice seguente indicherà $genderCategories per category_id, quindi non conterrà mai più di una categoria con lo stesso ID.

Annotare la proprietà indexBy nelle annotazioni.

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

Suggerisco tirando la chiamata persist fuori del vostro ciclo per migliorare le prestazioni.

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

$em->persist($gender); 
+2

'indexBy =" ID_categoria "' dovrebbe essere 'indexBy =" id "', come "id", l'attributo dell'entità lato inverso (qui BRCN \ TaxonomyBundle \ Entity \ Taxonomy) – ekans