2014-06-09 7 views
7

मुझे एक ही फ़ील्ड को विभिन्न मानकों के साथ जोड़ना होगा।समान इकाई पर सिद्धांत कईToMany डुप्लिकेट प्रविष्टि त्रुटि

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; 

ये चर एक ही मेज "आईडी" में एक ही स्तंभ नाम का उपयोग कर रहे हैं।

जब मैं "menu_relations" तालिका को देखता हूं, तो मुझे अपने पैरामीटर से जुड़े दो प्राथमिक कुंजी दिखाई देती हैं।

जब मैं नए रिकॉर्ड डालने के लिए प्रयास करते हैं, मैं इस त्रुटि हो रही है:

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'

सम्मिलित करना मान:

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

क्या त्रुटि उन विशिष्ट लिंग_आईडी = 9 4 और श्रेणी_आईडी = 1, या किसी भी सम्मिलन के लिए आती है? आप एक सम्मिलित क्वेरी कैसे करते हैं? क्या आपके पास उनके लिए उचित सेटटर है? – Javad

+0

नहीं, यह एक सम्मिलन के बाद से आ रहा है, दूसरे डालने में मेरा मतलब है। इससे कोई फर्क नहीं पड़ता है। –

+0

क्या आप अपने कंट्रोलर में कोड प्रदान कर सकते हैं कि आप सम्मिलन क्वेरी कैसे करते हैं? – Javad

उत्तर

9

आप सिद्धांत के indexed associations का लाभ लेने के डुप्लिकेट रिश्तों को जोड़ने से बचने के लिए कर सकते हैं।

नीचे दिया गया कोड $genderCategoriescategory_id से सूचकांक करेगा, इसलिए इसमें एक ही आईडी के साथ एक से अधिक श्रेणियां कभी नहीं रहेंगी।

एनोटेशन में indexBy संपत्ति नोट करें।

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

मैं अपने लूप से बाहर persist कॉल खींच करने का सुझाव के प्रदर्शन में सुधार करने के लिए।

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

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

'indexBy =" category_id "' होना चाहिए 'indexBy = "id" '," id "के रूप में, उलटा पक्ष इकाई की विशेषता (यहां BRCN \ TaxonomyBundle \ Entity \ Taxonomy) – ekans

संबंधित मुद्दे