Вопрос:

Доктрина - DQL - несколько OR, вложенных в один инкапсулирующий AND

php symfony doctrine dql

423 просмотра

1 ответ

465 Репутация автора

Я не могу найти пример 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)')
    )

Таким образом, у вас есть четыре ИЛИ, вложенных в одну инкапсулирующую AND.

Кто-нибудь знает, как это сделать с Doctrine DQL? Гнездится кучка операционных внутри одного гиганта И?

Автор: Brent Heigold Источник Размещён: 08.11.2017 11:46

Ответы (1)


3 плюса

68 Репутация автора

Решение

Вам нужно будет использовать 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'),
...

Вы можете прочитать больше о Expr()классе в документации .

РЕДАКТИРОВАТЬ:

Только что понял ваш начальный вопрос, заданный специально о DQL. Вы можете использовать парены в DQL для группировки вещей, что-то вроде этого.

$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');
Автор: blhylton Размещён: 09.11.2017 07:32
Вопросы из категории :
32x32