web-dev-qa-db-ja.com

DoctrineでandWhereおよびorWhereを使用する方法は?

WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)

Doctrineでこれを作成するにはどうすればよいですか?

$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には...?

63
Paul Attuck
$q->where("a = 1")
  ->andWhere("b = 1 OR b = 2")
  ->andWhere("c = 2 OR c = 2")
  ;
101
Maerlyn

より複雑な条件を持ち、Doctrine 2. *で QueryBuilder を使用する場合の例は次のとおりです。

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

これらはチェコ学の回答で言及された表現です。

65
Serge Kvashnin

どうして

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

[〜#〜] edit [〜#〜]Expr class (Doctrine2)も使用できます。

12
Czechnology

ここに欠けているものが1つあります。要素の数がさまざまで、それらを次のようなものにまとめたい場合

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')

自分でDQL-Stringを組み立てたくない場合は、上記の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);
6
leberknecht