DQL LEFT JOIN - sql示例

时间:2014-03-25 13:13:59

标签: sql doctrine-orm

运行良好的SQL是:

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中保留加入查询。

1 个答案:

答案 0 :(得分:2)

通常情况下,如果您的Resource实体具有$roles属性和正确的注释(OneToManyManyToMany),那么您的联接表(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查询中访问,那么Doc​​trine需要知道该表 - 它需要是映射到一个单独的实体,您需要明确表示您正在加入Resources,RoleResources和Roles。