web-dev-qa-db-ja.com

Doctrine findBy with OR条件

Doctrine findBy()メソッドでORステートメントを使用することは可能ですか?与えられた配列はcase1 AND case2... このような

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

を意味する

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

今、私は立つために何かが必要です:

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

すべてのケースを取得する方法はありますか?

44
ArVan

私の知る限り、これはDoctrineがfindbyでIN()クエリを使用するためにサポートされている機能ではありません。次の2つのことができます。

  1. (カスタム) 'notif'リポジトリクラスにfindByStatus(array $statusTypes)メソッドを実装します。このアプローチが気に入ったら、例を挙げましょう。

  2. FindByを次のように変換します。

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

それはどちらでも動作するはずです:)

14
Kees Schepers

あなたは書ける:

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

それもうまくいくはずです。

145
user3012985

これは古い質問です。とにかく、複雑なクエリにCriteriaを使用することが可能です(少なくともDoctrine 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);
14
antongorodezkiy

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),
                )
    ));
8
Paul Weber