Доктрина 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;

Есть ли способ получить все случаи?


person ArVan    schedule 13.02.2012    source источник


Ответы (4)


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

Тоже должно работать :)

person Kees Schepers    schedule 13.02.2012

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

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

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

person user3012985    schedule 20.11.2013
comment
Что делать, если я хочу применить ИЛИ между разными столбцами - person Ketav; 10.04.2017
comment
@KetavChotaliya, тогда вы используете собственный построитель запросов в репозитории. - person Erdal G.; 24.12.2020

Я знаю, что это старый вопрос. В любом случае, можно использовать 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);
person gorodezkiy    schedule 08.04.2015
comment
Для тех, кто отрицает, пожалуйста, оставьте комментарии, чтобы помочь другим понять ваше решение. Спасибо - person gorodezkiy; 08.10.2015
comment
Как вы можете добавить критерии и правила сортировки и ограничения в репозиторий? Можете ли вы поделиться примером? Прямо сейчас SQL в вашем примере будет добавлять только предложения where, как нам добавить limit и orderby? - person Joseph Astrahan; 28.01.2016
comment
@JosephAstrahan, может быть, к сожалению, пока я понятия не имею, и у меня нет проекта, чтобы проверить это в данный момент. А есть ли упоминания о limit или orderby в вопросе автора? - person gorodezkiy; 28.01.2016
comment
@JosephAstrahan Возможно, уже не актуально, но для справки в будущем Criteria имеет orderBy - person someonewithpc; 21.07.2020

Если вы используете MongoDB и вам нужны более сложные запросы, такие как «меньше чем», связанные вместе с ИЛИ, но вы не можете использовать построитель запросов, это также работает с этим синтаксисом:

   ->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),
                )
    ));
person Paul Weber    schedule 09.02.2015
comment
Это не работает в случае, изложенном в вопросе. Разве это не особый синтаксис mongodb? - person karka91; 02.09.2015
comment
Я не использовал MongoDB с доктриной, но это определенно синтаксис MongoDB. - person Scott Flack; 16.11.2015
comment
Вы правы, но это пройдено. Я использую этот код в работе с Doctrine и Symphony, и он работает (кажется, проходит) и возвращает правильные результаты. Это мой стек... доктрина/mongodb-odm-bundle: 3.0.*@dev, доктрина/mongodb-odm: dev-master, доктрина/mongodb: dev-master, ext-mongo: *, - person Paul Weber; 16.11.2015
comment
Я также могу сказать, что это не работает с настройками, отличными от mongoDB. - person Joseph Astrahan; 28.01.2016
comment
Упс. Да! Я думал, что вопрос был специфичен для mongodb. Отмечу это в моем ответе! - person Paul Weber; 29.01.2016