2014-06-09 16 views
7

Aynı alanı farklı parametrelerle ilişkilendirmem gerekiyor.Aynı Varlık Üzerine Çok Kez Dokümenle Çoğaltılmış Giriş Hatası

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; 

Bu değişkenler aynı tablo "id" aynı sütun adını kullanıyor.

"Menu_relations" tablosuna baktığımda, parametrelerim ile ilişkili iki birincil anahtar görüyorum.

i yeni kayıtlar eklemeye çalışırsanız

, ben bu hatayı alıyorum:

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'

takma değerleri:

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

Hata, söz konusu özel cinsiyet_kimliği = 94 ve category_id = 1 veya herhangi bir ek için mi geliyor? Ekleme sorgusu nasıl yapılır? Onlar için uygun bir ayarlayıcınız var mı? – Javad

+0

Hayır, bir ekleme işleminden sonra geliyor, ikinci eklentide. Bu bir fark yaratmıyor. –

+0

Denetleyicinizde, ekleme sorgusunu nasıl hazırladığınıza dair kod verebilir misiniz? – Javad

cevap

9

yinelenen ilişkileri eklemekten kaçının Doktrini en indexed associations yararlanmak olabilir.

Aşağıdaki kod, category_id tarafından $genderCategories dizinini dizinleyecektir, bu nedenle aynı kimliğe sahip birden fazla kategori içermez.

Ek açıklamalarda indexBy özelliğine dikkat edin.

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

ben performansını artırmak için döngünün dışında persist çağrıyı çekerek öneririz.

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

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

'indexBy =" category_id "," id "olarak," id "olarak," tersi "taraf özniteliğinin (burada BRCN \ TaxonomyBundle \ Entity \ Taxonomy) olması gerekir – ekans

İlgili konular