2012-02-13 66 views
37

是否有可能在Doctrine findBy()方法中使用OR声明? 我知道,给数组被解释为case1 AND case2... 喜欢这个主义findBy与OR条件

$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; 

有没有办法让所有情况?

回答

12

据我所知,这不是支持的功能由教条使用IN()查询与findby。你可以做两件事情:

  1. 实现你的(自定义)一findByStatus(array $statusTypes)方法“通知符” repository类。如果你喜欢这种方法,我可以给你一个例子。

  2. 转换您findBy以下几点:

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

这应该工作,要么:)

+0

Yeay,我心中已经已经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

我没有使用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

对于那些谁downvote,请发表评论,以帮助其他人了解你的决定谢谢 – antongorodezkiy

+0

你怎么可以添加标准和排序,并限制规则库也?你能分享一个例子吗?现在,在您的示例的SQL只会增加where子句中,我们如何增加限制和排序依据? –

+0

@JosephAstrahan也许,不幸的是我现在不知道,现在也没有项目来测试它。但是在作者的问题中是否提到了限制或命令? – antongorodezkiy