使用Doctrine2

时间:2016-06-30 01:30:39

标签: php doctrine

我对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连接用户和组?以及如何禁止它?

1 个答案:

答案 0 :(得分:0)

这是因为你的注释强制它,更好的说法我应该说你按用户聚合组表。你应该删除许多可以加入你的注释以跳过这个。当您在数据库字段中存在关系时,Doctrine将创建多对多的连接。