53

是否可以在 Doctrine 方法中使用OR语句findBy()?我知道给定的数组被解释为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;

有没有办法获取所有案例?

4

4 回答 4

176

你可以写:

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

这也应该有效。

于 2013-11-20T12:15:15.757 回答
22

我知道这是个老问题。无论如何,可以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);
于 2015-04-08T23:18:40.070 回答
15

据我所知,Doctrine 不支持将 IN() 查询与 findby 一起使用。你可以做两件事:

  1. findByStatus(array $statusTypes)在您的(自定义)“notif”存储库类中实现一个方法。如果你喜欢这种方法,我可以给你一个例子。

  2. 将您的 findBy 转换为以下内容:

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

那应该可以工作:)

于 2012-02-13T10:54:30.453 回答
9

如果您正在使用 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),
                )
    ));
于 2015-02-09T14:41:41.663 回答