2012-02-13 32 views
37

Doctrine findBy()メソッドでORステートメントを使用することはできますか?取得する方法はありOR条件付きDoctrine findBy

SELECT * FROM `notif` WHERE status=1 OR status=2 OR status=3; 

: は、私は指定された配列は、私が立って何かを必要と

SELECT * FROM `notif` WHERE status=1 AND status=2 AND status=3; 

のために、この

$this->repos['notif']->findBy(array('status' => 1, 'status' => 2, 'status' => 3); 

スタンドのようにcase1 AND case2... として解釈されていることを知っていますすべての場合?

答えて

12

私が知る限り、これはDoctrineがfindbyでIN()クエリを使用するためのサポートされている機能ではありません。リポジトリクラスのNOTIF "

  1. があなたの(カスタム)でfindByStatus(array $statusTypes)メソッドを実装します。あなたは二つのことを行うことができます。このアプローチが好きなら、私はあなたに例を挙げることができます。

  2. 以下にごfindByを変換します

    $qb = $this->repos['notif']->createQueryBuilder('n'); 
    $data = $qb->where($qb->expr()->in('status', array(1,2,3)))->getQuery()->getResult(); 
    

いずれかの動作しなければならないこと:)

+0

Yeay、I'vはすでに、これは多くのことを私を助け、QueryBuilder :) – ArVan

118

あなたが書くことができます。

$this->repos['notif']->findBy(array('status' => array(1, 2, 3))); 

、それはあまりにも動作するはずですが。

+2

は非常に簡単なことでこれを行って;-)ありがとう –

+1

これは間違いなく選択された投票回答になるはずです。 – tfont

+2

異なる列間でORを適用する場合はどうすればいいですか? –

7

あなたはMongoDBのを使用してORと一緒にリンクされますが、クエリビルダを使用することはできません「未満」のような、より複雑なクエリを、必要がある場合、これはまた、この構文で動作します:

->findBy(array(
       '$or' => array(
        array('foo' => array('$lt' => 1234)), 
        array('$and' => array(
         array('bar' => 45678), 
         array('baz' => array('$lt' => 89013)) 
        )) 
       ) 
    )); 

かのようにあなたの質問に対する解決策:

->findBy(array(
       '$or' => array(
        array('status' => 1), 
        array('status' => 2), 
        array('status' => 3), 
       ) 
    )); 
+2

質問に記載されているケースでは機能しません。このmongodb固有の構文ではありませんか? – karka91

+2

私はdoctrineでMongoDBを使っていませんが、それは間違いなくMongoDB構文です。 –

+0

あなたは正しいですが、これは通過します。私はDoctrineとSymphonyのプロダクションでこのコードを使用していますが、これは正しく機能しています。これは私のスタックです... \t \t "doctrine/mongodb-odm-bundle": "3.0。* @ DEV」、 \t \t "教義/ MongoDBの-ODM": "DEV-マスター"、 \t \t "教義/ MongoDBの": "DEV-マスター"、 \t \t "EXT-モンゴ": "*"、 –

12

これは古い質問です。とにかく、それは複雑なクエリのためにCriteriaを使用することが可能です(教義2には、少なくとも):

$criteria = new \Doctrine\Common\Collections\Criteria(); 
$criteria 
    ->orWhere($criteria->expr()->contains('domains', 'a')) 
    ->orWhere($criteria->expr()->contains('domains', 'b')); 

$groups = $em 
    ->getRepository('Group') 
    ->matching($criteria); 
+2

、他の人があなたの決定を理解するためのコメントを残してください。 – antongorodezkiy

+0

条件を追加したり、ルールを並べ替えたり、リポジトリに制限したりするにはどうすればいいですか?例を共有できますか?今の例のSQLではwhere句だけが追加されますが、limit&orderbyを追加するにはどうすればよいでしょうか? –

+0

@JosephAstrahan多分、残念ながら私は今考えておらず、現時点でテストするプロジェクトはありません。しかし、著者の質問に限界や秩序の言及はありませんか? – antongorodezkiy