使用Doctrine2的不必要连接条件


Unwanted join condition using Doctrine2

我对Doctrine2很陌生,我正试图通过使用它来学习它。

我有两个表,group和user。集团可设董事长、副董事长和成员。当我试图获得用户作为主席或副主席的组列表时,我的问题发生了。这是我在Group实体中对副董事长的注释。

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

Query builder

$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));

(kinda)期望的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和重命名的别名)

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连接用户和组?如何禁止呢?

这是因为你的注释强迫它,更确切地说,我应该说你按用户聚合组表。您应该删除注释中的许多可能连接以跳过此操作。当您的数据库字段中有关系时,Doctrine将创建多对多连接。