2014-06-09 3 views
7

동일한 필드를 다른 매개 변수와 연결해야합니다.Doctrine 동일한 엔티티의 ManyToMany 중복 엔트리 오류

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; 

이러한 변수가 동일한 테이블 "ID"열에서 동일한 이름을 사용한다.

"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

특정 gender_id = 94 및 category_id = 1 또는 삽입에 대한 오류가 발생합니까? 삽입 쿼리는 어떻게 작성합니까? 당신은 그들에게 적절한 세터가 있습니까? – Javad

+0

아니요, 그것은 삽입 후, 두 번째 삽입에서 오는 것입니다. 그것은 차이를 만들지 않습니다. –

+0

삽입 쿼리를 어떻게 작성하는지 컨트롤러에 코드를 제공 할 수 있습니까? – Javad

답변

9

을 중복 관계를 추가 피하기 위해 교리의 indexed associations을 활용할 수 있습니다.

아래 코드는 $genderCategoriescategory_id으로 색인을 생성하므로 동일한 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; 
} 

(!) 참고

내가 성능을 향상시키기 위해 루프 밖으로 persist 전화를 당기는 것이 좋습니다.

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

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

'indexBy = "category_id"는 "id"로'indexBy = "id"'가되어야하며, 역변환 된 엔티티의 속성 (여기서는 BRCN \ TaxonomyBundle \ Entity \ Taxonomy) – ekans

관련 문제