Доктрина найти с условием ИЛИ - PullRequest
43 голосов
/ 13 февраля 2012

Можно ли использовать оператор OR в методе Doctrine 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 ]

144 голосов
/ 20 ноября 2013

Вы можете написать:

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

, и это тоже должно работать.

14 голосов
/ 09 апреля 2015

Я знаю, что это старый вопрос.В любом случае, для сложных запросов можно использовать 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 голосов
/ 13 февраля 2012

Насколько я знаю, 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();
    

Это должно работать либо:)

8 голосов
/ 09 февраля 2015

Если вы используете 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),
                )
    ));
...