2015-10-06 4 views
0

Я создаю приложение Symfony, где пользователь может выполнить поиск по форме поиска со многими полями. Теперь мой DQL запрос выглядит следующим образом:DQL Как вернуть все записи, когда параметр пуст

$users = $repository->createQueryBuilder('u') 
     ->addSelect('u') 
     ->from('AppBundle:User', 'b') 
     ->where('u.Number = :Number **OR u.Number = :blank'**) 
     ->andWhere('u.Code = :Code') 
     ->setParameter('Number', $Number) 
     ->setParameter('blank', $blank) 
     ->setParameter('Code', $code) 
     ->getQuery() 
     ->getResult(); 

Проблема заключается в том, что я хочу, чтобы мой запрос, чтобы вернуть все записи, связанные с критериями, когда пользователь оставляет некоторые поля пустыми. Прямо сейчас никакие записи не возвращаются, потому что система думает, что мне нужны записи с конкретными «пустыми» критериями. Буду признателен за любые идеи. Спасибо

ответ

0

Если я правильно понимаю, вы на самом деле есть 2 параметра, в данном случае, а именно: Number и Code. И если один из них «пуст», то у вас есть набор переменных blank?

Если это так, то я думаю, вы должны написать запрос, как это:

$query = $repository->createQueryBuilder('u') 
     ->addSelect('u') 
     ->from('AppBundle:User', 'b') 

if ($Number != "") 
    $query->where('u.Number = :Number') 
     ->setParameter('Number', $Number); 

if ($code != "") { 
    if ($Number != "") $query->andWhere('u.Code = :Code'); 
    else $query->where('u.Code = :Code'); 
    $query->setParameter('Code', $code); 
} 

$users = $query->getQuery()->getResult(); 
+0

Это работает !! И в случае, если у меня нет 2 полей, как сейчас, но , скажем, 10 полей поиска, мне нужно записать 10 блоков if-else или даже 10 * 10 блоков, чтобы оправдать все возможные ситуации с помощью пользователя, правильно? Или, может быть, есть какое-то обходное решение для такой ситуации? Спасибо – Jack

+0

Если у вас несколько полей, вы должны поместить их в массив, чтобы вы могли заменить строки выше на цикл 'foreach'. – Dric512

+0

Хороший совет, спасибо. Можно ли увидеть какой-либо пример такой реализации? мне потребуется много времени, чтобы пройти через это))) – Jack

1

Вы можете использовать Expr class в DQL, чтобы структурировать запрос в поле 'blank', предоставленное пользователем. Простой if(!empty($field)) будет делать трюк

$query = $repository->createQueryBuilder('u') 
    ->addSelect('u') 
    ->from('AppBundle:User', 'b') 
    ->where('u.Number = :Number') 
    ->andWhere('u.Code = :Code') 
    ->setParameter('Number', $Number)  
    ->setParameter('Code', $code); 

if(!empty($blank)){ 
    $query->andWhere($query->expr()->orX(
    $query->expr()->eq('u.Number', ':blank') 
)); 
    $query->setParameter('blank', $blank); 
} 

$users = $query->getQuery()->getResult(); 
+0

и что это значение $ заготовки должно быть? Теперь я устанавливаю его так: '$ blank =" ";' и все же он думает, что мне нужны пустые записи и ничего не возвращает (( – Jack

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