【问题标题】:DQL LEFT JOIN - sql exampleDQL LEFT JOIN - sql 示例
【发布时间】:2014-03-25 13:13:59
【问题描述】:

运行良好的 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

角色资源:id_role_resource, role_id, resource_id, permission

资源:id_resource, controller,action ...

在最后一个表中,表role_resource中没有对应的记录。 这就是为什么我需要在 DQL 中使用这个左连接查询。

【问题讨论】:

  • 您使用哪些注释将此架构映射到实体?
  • 嗯,到目前为止你有什么,为什么它不起作用?请注意,我更喜欢LEFT JOIN (a JOIN b ON ...) ON ...,而不是在普通 SQL 中链接 LEFT JOINs(这可以使某些查询中返回的行的推理变得有趣)

标签: sql doctrine-orm


【解决方案1】:

通常,如果您有一个具有$roles 属性和正确注释(OneToMany、ManyToMany)的Resource 实体,那么您的连接表(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 并且可以在 Doctrine 查询中访问,那么 Doctrine 需要知道该表——它需要映射到一个单独的实体,您需要明确说明您要加入资源、角色资源和角色。

【讨论】:

  • 他在 role_resource 上有一个权限列,因此他必须使用 RoleResource 定义三个实体,这些实体与 Role 和 Resource 具有 OneToMany 关系。 SELECT Role,RoleResource,Resource FROM ...Entity\Resource resource LEFT JOIN resource.roles roleResource LEFT JOIN roleResource 资源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2010-09-29
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多