我正在尝试通过测试属性的属性来创建DQL查询。其目标是创建一个DQL查询,该查询将指示用户执行作业的角色,如果用户没有适当的角色,则不返回任何行。
我的实体是角色、作业和用户。用户有角色,作业需要一个角色(来完成它们),角色有链接到另一个角色的“替代”,该角色可以填补该角色。
实体的存根版本如下所示:
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,并在第二个阶段抛出了这个错误:
[Syntax Error] line 0, col 210: Error: Expected =, <, <=, <>, >, >=, !=, got '.' 我的DQL尝试如下所示
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:
#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.
发布于 2013-07-03 04:54:01
我想通了。有可能..。您需要连接子对象,然后才能使用它们。我不得不改变连接的顺序,我对我的过滤器使用子句而不是WHERE并不是很满意,但很难与结果争论!
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英尺视图“是这样的:
有点奇怪,但一旦你理解了就相当简单了。
https://stackoverflow.com/questions/17432295
复制相似问题