Doctrine - DQL-多个OR嵌套在一个封装AND中

时间:2017-11-08 23:46:49

标签: php symfony doctrine dql

我无法找到DQL的示例,这里是半伪代码的样子:

Bring back invoices
- Where company id = 5
AND
    (
      ->where('DATE(i.startPeriod) BETWEEN :startDate AND :endDate')
      ->orWhere('DATE(i.endPeriod) BETWEEN :startDate AND :endDate')
      ->orWhere(':startDate BETWEEN DATE(i.startPeriod) and DATE(i.endPeriod)')
      ->orWhere(':endDate BETWEEN DATE(i.startPeriod) and DATE(i.endPeriod)')
    )

所以你有四个OR嵌套在一个封装AND中。

有没有人知道如何使用Doctrine DQL做到这一点?在一个巨大的AND中嵌入一堆OR?

1 个答案:

答案 0 :(得分:3)

您需要将Expr()类与查询构建器一起使用。

// $qb instanceof QueryBuilder

$qb->select('i')
   ->from('invoices', 'i')
   ->where('c.id = :cid')
   ->andWhere($qb->expr()->orX(
       $qb->expr()->between('i.startPeriod',':startdate',':enddate'),
       $qb->expr()->between('i.endPeriod',':startdate',':enddate'),
...

您可以在the documentation中详细了解Expr()课程。

修改

刚刚意识到你的初步问题是专门询问DQL的。您可以在DQL中使用parens对事物进行分组,所以就像这样。

$query = $em->createQuery(
   'SELECT i FROM Invoices i 
    WHERE c.id = :id 
    AND (
        (i.startPeriod BETWEEN :startDate AND :endDate) 
        OR 
        (i.endPeriod BETWEEN :startDate AND :endDate)
        OR 
        (:startDate BETWEEN i.startPeriod AND i.endPeriod)
        OR
        (:endDate BETWEEN i.startPeriod AND i.endPeriod)
    ) JOIN i.company c');