我对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将创建多对多连接。