我对Doctrine2很新,我试图通过使用它来学习它。
我有两个表,组和用户。集团可以有一个主席,副主席和成员。当我试图获得用户作为主席或副主席的组列表时,我的问题就出现了。这是我对集团实体中的副主席的注释。
/**
* @var string
*
* @ORM\ManyToMany(targetEntity="User")
* @ORM\JoinTable(name="vicechairmen",
* joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )
*/
private $vicechairmen;
查询构建器
$qry = $this->entManager->getRepository("Entities\Local\Group")->createQueryBuilder("g");
$qry->leftJoin("g.vicechairmen", "gv", "WITH", "gv.id = g.id");
$qry->where($qry->expr()->eq('g.chairman', $id))->orWhere($qry->expr()->eq('gv.id', $id));
(有点)预期的SQL查询将是
SELECT g.id FROM `group` g
LEFT JOIN vicechairmen vg ON g.id = vg.group_id
LEFT JOIN user u ON u.id = vg.user_id
WHERE g.chairman_id = 4 OR u.id = 4
但我得到了(缩短了选择和重命名的别名)
SELECT g.id FROM `group` g
LEFT JOIN vicechairmen vg ON g.id = vg.group_id
LEFT JOIN user u ON u.id = vg.user_id AND u.id = g.id
WHERE g.chairman_id = 4 OR u.id = 4
问题是为什么学说试图通过他们的ID连接用户和组?以及如何禁止它?
答案 0 :(得分:0)
这是因为你的注释强制它,更好的说法我应该说你按用户聚合组表。你应该删除许多可以加入你的注释以跳过这个。当您在数据库字段中存在关系时,Doctrine将创建多对多的连接。