Я пытаюсь сделать что-то похожее на этот 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()


Вы можете использовать метод $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();
Ваши сомнения верны, и вы можете столкнуться с проблемой приоритета оператора с текущим кодом, который у вас есть. Чтобы написать эквивалентный запрос с условиями группировки в доктрине, вы можете написать следующим образом
->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 с объединением