Доктрина findBy с условием ИЛИ
Можно ли использовать инструкцию 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;
Есть ли способ получить все случаи?
Ответы
Ответ 1
Насколько я знаю, это не поддерживаемая функция Doctrine для использования запросов IN() с findby. Вы могли бы сделать две вещи:
-
Внедрите метод findByStatus(array $statusTypes)
в свой (пользовательский) класс хранилища notif. Если вам нравится этот подход, я могу привести вам пример.
-
Преобразуйте ваш findBy в следующее:
$qb = $this->repos['notif']->createQueryBuilder('n');
$data = $qb->where($qb->expr()->in('status', array(1,2,3)))->getQuery()->getResult();
Это должно работать либо:)
Ответ 2
Вы можете написать:
$this->repos['notif']->findBy(array('status' => array(1, 2, 3)));
и это тоже должно работать.
Ответ 3
Я знаю, что это старый вопрос. В любом случае, возможно использовать 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);
Ответ 4
Если вы используете 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),
)
));