SELECT ro.id_role
,rr.id_role_resource
,re.id_resource
FROM resource re
LEFT JOIN role_resource rr
ON rr.resource_id = re.id_resource
LEFT JOIN role ro
ON ro.id_role = rr.role_id
现在我必须写DQL- 这是表格shema:
角色:id_role, name
role_resource:id_role_resource, role_id, resource_id, permission
资源:id_resource, controller,action ...
是表role_resource中没有对应的记录。 这就是为什么我需要这个在DQL中保留加入查询。
答案 0 :(得分:2)
通常情况下,如果您的Resource
实体具有$roles
属性和正确的注释(OneToMany
,ManyToMany
),那么您的联接表(role_resource
)不会或不需要和自己的auto_increment id。
这是因为Doctrine处理关联信息并根据它们知道何时需要连接表。 Doctrine还知道在基于相同的关联信息加入两个实体时要使用的条件。
因此,如果SQL查询通过使用2个join子句通过第三个表连接两个表,则只需要告知DQL查询关联名称,它将具有所有" join table" &安培; "加入条件"信息。
所以一个简单的查询看起来像:
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并且可以在Doctrine查询中访问,那么Doctrine需要知道该表 - 它需要是映射到一个单独的实体,您需要明确表示您正在加入Resources,RoleResources和Roles。