SQL-Doctrine / DQL如何构建此查询

时间:2018-06-20 22:45:01

标签: sql doctrine many-to-many

我有一个名为Event的实体和一个名为Employee的实体

Event有一个ManyToOne的{​​{1}}称为Employee

它也有一个scheduledEmployeeManyToMany叫做Employee

employeeRequests中有一个column的{​​{1}}

还有一个名为Event table的{​​{1}}

我该如何查询所有employee_id已被安排或请求的Join Table

Event_Employee_Requests

我能够获取预定的所有Events,但不确定如何获取请求的事件。

更新

我尝试了以下方法:

Employee

这给出了以下查询:

$qb = $this->createQueryBuilder('e')
        ->where('e.scheduledEmployee = :user')
        ->setParameter('user', $user)
        ->getQuery();

尽管我不确定如何使用DQL进行操作,但是如果我删除了Events的{​​{1}}子句,则此查询有效。

当前,上述 $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(); 仅返回请求的事件,而不返回预定的事件

1 个答案:

答案 0 :(得分:0)

要获取为员工安排/请求的事件,可以使用类似于查询生成器代码的左联接方法

$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)