2014-06-09 10 views
7

Muszę powiązać to samo pole z różnymi parametrami.Doktryna ManyToMany na tej samej jednostce Powielony błąd wpisu

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; 

te zmienne są za pomocą tej samej nazwie kolumny w tej samej tabeli, "ID".

Kiedy patrzę na tabelę "menu_relations", widzę dwa podstawowe klucze powiązane z moimi parametrami.

Kiedy próbuję wstawić nowe rekordy, dostaję ten błąd:

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'

Wstawianie wartości:

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

Czy błąd pojawia się dla tych konkretnych gender_id = 94 i category_id = 1, czy dla dowolnej wstawki? Jak utworzyć zapytanie wstawiania? Czy masz dla nich odpowiedniego setera? – Javad

+0

Nie, pochodzi z po wstawieniu, w drugim wkładzie mam na myśli. To nie ma znaczenia. –

+0

Czy możesz podać kod w kontrolerze, w jaki sposób utworzyć kwerendę wstawiania? – Javad

Odpowiedz

9

Można skorzystać z doktryny indexed associations aby uniknąć dodawania duplikaty relacje.

Poniższy kod będzie indeksować $genderCategories przez category_id, więc nigdy nie będzie zawierać więcej niż jedną kategorię o tym samym id.

Uwaga na właściwość indexBy w adnotacjach.

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

Proponuję ciągnąc rozmowę persist z Twojego pętli w celu zwiększenia wydajności.

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

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

'indexBy =" id_kategorii "' powinno być 'indexBy =" id "', jako "id", atrybut odwróconej jednostki strony (tutaj BRCN \ TaksonomicznaBundle \ Jednostka \ Taksonomia) – ekans

Powiązane problemy