首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在属性的属性上联接的DQL

在属性的属性上联接的DQL
EN

Stack Overflow用户
提问于 2013-07-03 01:44:45
回答 1查看 2.6K关注 0票数 2

我正在尝试通过测试属性的属性来创建DQL查询。其目标是创建一个DQL查询,该查询将指示用户执行作业的角色,如果用户没有适当的角色,则不返回任何行。

我的实体是角色、作业和用户。用户有角色,作业需要一个角色(来完成它们),角色有链接到另一个角色的“替代”,该角色可以填补该角色。

实体的存根版本如下所示:

代码语言:javascript
运行
复制
class User {
    //Annotation not needed for question 
    protected $id;

    /**
      * @var SystemBundle\Entity\Role
      *
      * @ORM\ManyToMany(targetEntity="SystemBundle\Entity\Role")
      * @ORM\JoinTable(name="User_User__Role",
      *   joinColumns={
      *     @ORM\JoinColumn(name="User_ID", referencedColumnName="ID")
      *   },
      *   inverseJoinColumns={
      *     @ORM\JoinColumn(name="Role_ID", referencedColumnName="ID")
      *   }
      * )
      */
     protected $roles;
}

class Job {
    //Annotation not needed for question 
    protected $id;

   /**
     * @var SystemBundle\Entity\Role $jobRole
     *
     * @ORM\ManyToOne(targetEntity="Role")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="Role_ID", referencedColumnName="ID")
     * })
     */
    protected $jobRole;
}

class Role {
    //Annotation not needed for question 
    protected $id;

   /**
     * @var SystemBundle\Entity\Role $jobRole
     *
     * @ORM\OneToOne(targetEntity="Role")
     * @ORM\JoinColumn(name="BackupRole_ID", referencedColumnName="ID")
     */
    protected $backUpRole;
}

概念逻辑是将角色与作业连接,测试当前角色是job.JobRole还是job.JobRole.backUpRole。我已经尝试过了,doctrine似乎真的不喜欢job.jobRole.backUpRole,并在第二个阶段抛出了这个错误:

代码语言:javascript
运行
复制
[Syntax Error] line 0, col 210: Error: Expected =, <, <=, <>, >, >=, !=, got '.' 

我的DQL尝试如下所示

代码语言:javascript
运行
复制
            SELECT r
            FROM SystemBundle:Role r
            INNER JOIN ProcessBundle:Job j
            WITH j = :j AND j.jobRole = r OR j.jobRole.backUpRole = r
            LEFT JOIN UserBundle:User u
            WITH r MEMBER OF u.roles
            WHERE u = :emp AND u IS NOT NULL 
            ORDER BY r.id

我可以使用纯SQL完成这个任务,也可以使用php遍历关联,但我希望保持使用DQL (因为它让我很恼火,我想知道它是否可以做到)。

如果有帮助,下面是我的纯SQL:

代码语言:javascript
运行
复制
#get all roles
select r.*
from Sys_Role as r
inner join

#get the role assigned to the job
(select r.*
FROM Sys_Role as r
INNER JOIN Sys_Job as j
ON j.JobRole_ID = r.ID
WHERE j.ID = ?) as jr

#join roles based on the job-role's id or backup id
# this should filter the list of roles down to the role and backup role for the job
on ar.ID = aar.ID OR  ar.ID = aar.BackUpRole_ID

# and filter by the roles the user is assigned
INNER JOIN User_User__Role as uur
ON r.ID = uur.Role_ID 
WHERE uur.User_ID = ?

编辑:我的道歉。在编辑问题布局时,我不小心删除了DQL。我在问题后面加上了这句话!

更新:我正在探索让$backUpRole成为一个双向的自连接,并从那个方向进行攻击。主义不喜欢天真的尝试,所以看起来如果使用这种策略,就需要新的DQL。

将DQL更改为WITH j = :j AND j.jobRole = r OR j.jobRole = r.roleIBackUp会产生一个新错误:A single-valued association path expression to an inverse side is not supported in DQL queries. Use an explicit join instead.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-03 04:54:01

我想通了。有可能..。您需要连接子对象,然后才能使用它们。我不得不改变连接的顺序,我对我的过滤器使用子句而不是WHERE并不是很满意,但很难与结果争论!

代码语言:javascript
运行
复制
            SELECT r
            FROM SystemBundle:Role r
            LEFT JOIN UserBundle:User u
            WITH u = :emp
            INNER JOIN ProcessBundle:Job j
            WITH j = :job
            JOIN j.jobRole jr
            JOIN jr.backUpRole jrbr
            WHERE (jr = ar OR jrbr = ar) AND r MEMBER OF u.role

这个DQL如何工作的"30,000英尺视图“是这样的:

  • Foreach Role
  • 此角色是否属于用户?
  • 获取我们需要的作业的角色
  • 别名该角色
  • ROles备份的别名
  • 此角色是作业的角色还是作业的备份角色?H213

有点奇怪,但一旦你理解了就相当简单了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17432295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档