SQL-Doctrine/DQL如何构建此查询
我有一个名为SQL-Doctrine/DQL如何构建此查询,sql,doctrine,many-to-many,Sql,Doctrine,Many To Many,我有一个名为Event的实体和一个名为Employee 事件有一个名为scheduledEmployee 它还有一个名为employeeRequests的manytomy和employeeRequests 在事件表中有一个列,名为employee\u id 还有一个名为Event\u Employee\u Requests的Join表 我如何查询已安排或请求员工的所有事件 $qb = $this->createQueryBuilder('e') ->where('e.
Event
的实体和一个名为Employee
事件
有一个名为scheduledEmployee
它还有一个名为employeeRequests
的manytomy
和employeeRequests
在事件表中有一个列
,名为employee\u id
还有一个名为Event\u Employee\u Requests的Join表
我如何查询已安排或请求员工的所有事件
$qb = $this->createQueryBuilder('e')
->where('e.scheduledEmployee = :user')
->setParameter('user', $user)
->getQuery();
我能够获取所有已计划的事件
,但不确定如何获取请求的事件
更新
我尝试了以下方法:
$qb = $this->createQueryBuilder('e')
->join('e.employeeRequests', 'r')
->where('e.scheduledEmployee = :user')
->orWhere('(r.id = :user AND e.scheduledEmployee is NULL)')
->setParameter('user', $user)
->getQuery();
这将给出以下查询:
SELECT * FROM event e0_ JOIN event_user_request e2_ ON e0_.id = e2_.event_id INNER JOIN fos_user f1_ ON f1_.id = e2_.user_id WHERE e0_.scheduled_employee_id = 5 OR ((f1_.id = 5 AND e0_.scheduled_employee_id IS NULL))
如果我删除了JOIN event\u user\u request
的ON
子句,则此查询可以工作,尽管我不确定如何使用DQL执行此操作
目前,上述SQL
只返回请求的事件,而不返回已安排的事件要获取为员工安排/请求的事件,您可以使用与查询生成器代码类似的左连接方法
$qb = $this->createQueryBuilder('e')
->leftJoin('e.employeeRequests', 'r')
->where('e.scheduledEmployee = :user')
->orWhere('(r.id = :user AND e.scheduledEmployee IS NULL)')
->setParameter('user', $user)
->getQuery();
在sql中,它看起来像
SELECT *
FROM event e0_
LEFT JOIN event_user_request e2_ ON e0_.id = e2_.event_id
LEFT JOIN fos_user f1_ ON f1_.id = e2_.user_id
WHERE e0_.scheduled_employee_id = 5
OR (f1_.id = 5 AND e0_.scheduled_employee_id IS NULL)
这似乎奏效了!Join
和leftJoin
之间有什么区别?我想这是最好的解释