Как использовать andWhere и orWhere в Учении? - PullRequest
62 голосов
/ 01 февраля 2012
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 ...?

Ответы [ 4 ]

100 голосов
/ 01 февраля 2012
$q->where("a = 1")
  ->andWhere("b = 1 OR b = 2")
  ->andWhere("c = 2 OR c = 2")
  ;
64 голосов
/ 28 декабря 2015

Вот пример для тех, кто имеет более сложные состояния и использует Doctrine 2. * с QueryBuilder:

$qb->where('o.foo = 1')
   ->andWhere($qb->expr()->orX(
      $qb->expr()->eq('o.bar', 1),
      $qb->expr()->eq('o.bar', 2)
   ))
  ;

Это выражения, упомянутые в чешском ответе.

12 голосов
/ 01 февраля 2012

Почему не просто

$q->where("a = 1");
$q->andWhere("b = 1 OR b = 2");
$q->andWhere("c = 1 OR d = 2");

РЕДАКТИРОВАТЬ : Вы также можете использовать Expr класс (Doctrine2).

6 голосов
/ 21 февраля 2018

Здесь не хватает одной вещи: если у вас есть различное количество элементов, которые вы хотите соединить во что-то вроде

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);
...