2012-02-01 7 views
52
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 

私はDoctrineでどのようにすることができますか?DoctrineでandWhere and orwhereを使用する方法?

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

答えて

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

次に、 'where()'コールにすべてを入れないのはなぜですか? – MatBailie

+3

私はこの種の構文には満足しません...もしORをどこの "SQL"に移そうとすればどうでしょうか? 'b =? 'を使う必要があります。 OR b =? ' – Vyktor

+0

@Demsはい、確かに可能です。この方法はより速いです。 – Maerlyn

11

なぜだけではなく、

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

EDIT:またExpr class(Doctrine2)を使用することができます。

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

ものはCzechnologyの答えで述べた式です:

+0

質問はdoctrine 1.2です。リンクしたドキュメントは2.0用です。 – Maerlyn

+4

@Maerlyn、質問には 'doctrine-1.2'タグがありませんので、どのユーザが意味するのかはわかりません。その場合、私は暗黙のうちに最新のものを期待しています。 – Czechnology

+0

私の間違いは、doctrine2のクエリービルダーにandWhereとorWhereがあったことを知らなかった。 – Maerlyn

39

はここQueryBuilderと教義2. *を使用して、より複雑な条件とを持っている人のための例です。ここで行方不明

+1

が私を助けました。歓声:) – Sharpy35

+0

人生節約:ありがとう – Hooli

0

一つのこと:あなたが

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); 
関連する問題