2012-02-13 4 views
37

Возможно ли использовать заявление OR в Доктрине findBy() метод? Я знаю, что данный массив интерпретируется как case1 AND case2... как этотДоктрина findBy с условием ИЛИ

$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

Насколько я знаю, это не поддерживается функцией 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(); 
    

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

+0

Йеай, I'v уже сделали это, QueryBuilder :) – ArVan

118

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

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

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

+2

очень просто, это помогло мне много ;-) спасибо –

+1

Это определенно должен быть выбранный проголосовавший ответ. – tfont

+2

Что делать, если я хочу применить ИЛИ между разными столбцами –

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": "Дев-мастер", \t \t "доктрина/MongoDB": "Дев-мастер", \t \t "доб-Монго": "*", –

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 в вашем примере будет добавлять только предложения, как добавить ограничение и порядок? –

+0

@JosephAstrahan возможно, к сожалению На данный момент я понятия не имею, и у меня нет проекта, чтобы проверить его в данный момент. Но есть ли какие-либо упоминания о лимите или порядке в вопросе автора? – antongorodezkiy

Смежные вопросы