Doctrine ManyToMany对同一实体重复条目错误

时间:2014-06-09 12:35:41

标签: php sql symfony doctrine-orm

我必须将相同的字段与不同的参数相关联。

多对多:

/**
 * @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”表时,我看到两个与我的参数相关的主键。

当我尝试插入新记录时,我收到此错误:

  

执行'INSERT INTO menu_relations时发生异常   (gender_id,category_id)VALUES(?,?)'与params [94,1]:

     

SQLSTATE [23000]:完整性约束违规:1062重复条目   关键'PRIMARY'的'94 -1'

插入值:

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

1 个答案:

答案 0 :(得分:9)

您可以利用Doctrine的indexed associations来避免添加重复的关系。

以下代码会将$genderCategories编入category_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);