一般来说,如果你将有一个Resource
实体与$roles
属性和正确标注(OneToMany
,ManyToMany
),那么你的连接表(role_resource
)将没有或不需要和AUTO_INCREMENT ID自身。
这是因为Doctrine处理关联信息并根据它们知道何时需要连接表。根据相同的关联信息加入两个实体时,Doctrine也知道要使用什么条件。
因此,如果一个SQL查询将通过使用2个连接子句通过第三个表连接两个表,则只需要将DQL查询告知关联名称,并且它将具有所有“连接表”&“连接条件”信息可用。
因此,一个简单的查询,看起来像:
SELECT
/* i assume $idRole is the name of the property
* mapped to the id_role column
*/
ro.idRole,
/* i assume $idResource is the name of the property
* mapped to the id_resource column
*/
re.idResource
FROM YourNamespace\Resource re
JOIN re.roles
具有同等的QueryBuilder语法:
$this->getEntityManager()->createQueryBuilder()
->select(array('ro.idRole', 're.idResource'))
->from('YourNamespace\Resource', 're')
->join('re.roles');
但JOIN
默认为INNER JOIN
,所以我们希望通过重写查询,以解决这个问题:
SELECT ro.idRole,
re.idResource
FROM YourNamespace\Resource re
LEFT JOIN re.roles
与同等的queryBuilder语法:
$this->getEntityManager()->createQueryBuilder()
->select(array('ro.idRole', 're.idResource'))
->from('YourNamespace\Resource', 're')
->leftJoin('re.roles');
然而,如果你想的表role_resource
有它自己的AUTO_INCREMENT ID和在学说查询访问,然后主义需要知道关于这个数据表 - 它需要被映射到独立的实体,你需要明确你加入资源,角色资源和角色的事实。
你用什么注释来映射这个模式到实体? –
那么,到目前为止你有什么,为什么它不工作?请注意,不是在vanilla SQL中链接'LEFT JOIN'(它可以使有关行的推理在某些查询中返回有趣)我倾向于选择'LEFT JOIN(a JOIN b ON ...)ON ...' –