Ответ 1
$q->where("a = 1")
->andWhere("b = 1 OR b = 2")
->andWhere("c = 2 OR c = 2")
;
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)
Как я могу сделать это в Доктрине?
$q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")
это неверно... Должно быть:
$q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")
но как я могу это сделать? В Propel есть функция getNewCriterion, а в Doctrine...?
$q->where("a = 1")
->andWhere("b = 1 OR b = 2")
->andWhere("c = 2 OR c = 2")
;
Вот пример для тех, кто имеет более сложные условия и использует Doctrine 2. * с QueryBuilder
:
$qb->where('o.foo = 1')
->andWhere($qb->expr()->orX(
$qb->expr()->eq('o.bar', 1),
$qb->expr()->eq('o.bar', 2)
))
;
Это выражения, упомянутые в ответе Czechnology.
Почему не просто
$q->where("a = 1");
$q->andWhere("b = 1 OR b = 2");
$q->andWhere("c = 1 OR d = 2");
EDIT. Вы также можете использовать класс Expr (Doctrine2).
Здесь не хватает одной вещи: если у вас есть различное количество элементов, которые вы хотите соединить в нечто вроде
WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')
и не хотите собирать DQL-строку самостоятельно, вы можете использовать orX
упомянутый выше, вот так:
$patterns = ['abc', 'def'];
$orStatements = $qb->expr()->orX();
foreach ($patterns as $pattern) {
$orStatements->add(
$qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%'))
);
}
$qb->andWhere($orStatements);