教条findBy与OR条件

ArV*_*Van 44 findby doctrine-orm

是否可以OR在Doctrine findBy()方法中使用语句?我知道给定的数组被解释为case1 AND case2... 像这样

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

代表

SELECT * FROM `notif` WHERE status=1 AND status=2 AND status=3;
Run Code Online (Sandbox Code Playgroud)

现在我需要一些东西代表:

SELECT * FROM `notif` WHERE status=1 OR status=2 OR status=3;
Run Code Online (Sandbox Code Playgroud)

有办法获得所有案件吗?

小智 147

你可以写:

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

这应该也有效.

  • 如果我想在不同列之间应用OR,该怎么办? (5认同)
  • 这绝对应该是选定的投票答案. (3认同)
  • 非常简单,这帮助了我很多;-)谢谢 (2认同)

ant*_*kiy 15

我知道这是一个老问题.无论如何,它可以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);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些投票的人,请留下评论以帮助其他人理解您的决定.谢谢 (2认同)

Kee*_*ers 14

据我所知,Doctrine不支持使用带有findby的IN()查询.你可以做两件事:

  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();
    
    Run Code Online (Sandbox Code Playgroud)

这应该工作:)


Pau*_*ber 8

如果您正在使用MongoDB并且需要更复杂的查询,例如"少于"与OR链接在一起但不能使用查询构建器,则这也适用于以下语法:

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

或者作为您问题的解决方案:

   ->findBy(array(
                '$or' => array(
                    array('status' => 1),
                    array('status' => 2),
                    array('status' => 3),
                )
    ));
Run Code Online (Sandbox Code Playgroud)

  • 这在问题中概述的情况下不起作用.这个mongodb不是特定的语法吗? (2认同)
  • 我没有将MongoDB与doctrine一起使用,但这绝对是MongoDB语法. (2认同)