我必须将相同的字段与不同的参数相关联。
多对多:
/**
* @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ı'
]);
}
答案 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);