【问题标题】:SQL - Doctrine / DQL how do I build this querySQL - Doctrine / DQL 我如何构建这个查询
【发布时间】:2018-06-20 22:45:01
【问题描述】:

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

Event 有一个 ManyToOneEmployee 称为 scheduledEmployee

它还有一个ManyToManyEmployee,称为employeeRequests

Event table 中有一个column,名为employee_id

还有一个Join TableEvent_Employee_Requests

我将如何查询所有Events 已安排或请求Employee

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

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

更新

我尝试了以下方法:

        $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_user_requestON 子句,此查询将有效,但我不确定如何使用 DQL 执行此操作。

目前上面的SQL 只返回请求的事件,而不是计划的事件

【问题讨论】:

    标签: sql doctrine many-to-many


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2012-02-25
    • 2015-04-02
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多