Доктрина DQL WHERE (условие1 и условие2) ИЛИ (условие3 и условие4) - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь сделать что-то похожее на это SQL в DQL:

SELECT * FROM TBL
WHERE (something = foo AND something2 = foo2) 
OR (something3 = foo3 AND something4 = foo4)

Я понял, что это работает, но я серьезно сомневаюсь в этом; что ты думаешь?

->where('something = :foo')
->setParameter('foo', $fooValue)
->andWhere('something2 = :foo2')
->setParameter('foo2', $fooValue2)

->orWhere('something3 = :foo3')
->setParameter('foo3', $fooValue3)
->andWhere('something4 = :foo4')
->setParameter('foo4', $fooValue4)

->getQuery()
->getArrayResult()

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ваше сомнение верное, и вы можете столкнуться с проблемой принадлежности оператора к имеющемуся у вас коду. Чтобы написать эквивалентный запрос с условиями группировки в доктрине, вы можете написать следующее

->where(
    $qb->expr()->orX(
            $qb->expr()->andX(
                $qb->expr()->eq('something', ':foo'),
                $qb->expr()->eq('something2', ':foo2')
            ), 
            $qb->expr()->andX(
                $qb->expr()->eq('something3', ':foo3'),
                $qb->expr()->eq('something4', ':foo4')
            )
        )
)
->setParameter('foo', $fooValue)
->setParameter('foo2', $fooValue2)
->setParameter('foo3', $fooValue3)
->setParameter('foo4', $fooValue4)
->getQuery()
->getArrayResult();

Doctrine Query Builder вложил условия orX и andX с объединением

0 голосов
/ 04 сентября 2018

Вы можете использовать $em->createQuery метод

$query = $em->createQuery('SELECT t FROM Tbl t WHERE (t.something = :foo AND t.something2 = :foo2) OR (t.something3 = :foo3 AND t.something4 = :foo4)');
$query->setParameter(...);
$result = $query->getResult();
...