2014-12-17 2 views
1

Пользователь go te форма расширенного поиска. Он может вводить несколько значений и некоторую цену слайдера диапазона (jquery ui widget). Затем в контроллере я получаю значения и хочу найти все строки, где будет вычисляться хотя бы одно условие. Вот код хранилища:Между разработчиками запросов и Symfony2

public function advancedSearch($bag, $startPrice, $targetPrice) 
{ 
    $parameters = ['bag' => $bag]; 
    $query = $result = $this->getEntityManager() 
     ->createQueryBuilder() 
     ->select('t') 
     ->from('VputiTripBundle:Trip', 't'); 
    $query->orWhere('t.bag = :bag'); 
    $query->orWhere(
     $query->expr()->between('t.price', $startPrice, $targetPrice) 
    ); 
    $result = $query 
     ->setParameters($parameters) 
     ->setMaxResults(1) 
     ->getQuery() 
     ->getResult(); 

    return $result; 
} 

Whe Пуск- и target- цена равна 271 и 278, я получаю почту, где цена 300. То, что я делаю неправильно?

ответ

3

Я только что дал это быстрый взгляд, но я думаю, что это связано с тем, что вы используете orWhere(). Не должно быть andWhere()?

Сейчас ваш запрос, вероятно, возвращающие все результаты, где t.bag = :bagOR где цена находится между $startPrice и $targetPrice, объясняющей поведение, которое вы описали. Я предполагаю, что вы также получите результаты, где цена правильная, но где свойство bag не соответствует параметру $bag.

Edit:

Поскольку некоторые из фильтров не может быть установлен, вы только хотите, чтобы применить их, когда они есть. Я думаю, что лучший способ пойти здесь - построить свой запрос динамически, используя инструкции PHP if. Например:

public function advancedSearch($bag, $startPrice, $targetPrice) 
{ 
    $parameters = array(); 

    // $query = $result = $this->getEntityManager() ... etc 

    if (!empty($bag)) { 
     $query->andWhere('t.bag = :bag'); 
     $parameters['bag'] = $bag; 
    } 

    if (!empty($startPrice) && !empty($targetPrice)) { 
     $query->andWhere(
      $query->expr()->between('t.price', $startPrice, $targetPrice) 
     ); 
    } 

    // $result = $query->setParameters($parameters) ... etc 

    return $result; 
} 
+0

Да, вы правы, моя ошибка. Но что, если я хочу получить результаты только для цен, и сумка будет равна нулю? – nowiko

+0

Итак, вам нужен эквивалент QueryBuilder 'WHERE price МЕЖДУ: startPrice AND: targetPrice AND (bag =: bag OR bag IS NULL)'? –

+0

да, что-то вроде этого, проблема в том, что я получу несколько входов в контроллер (сумка, цена и т. Д.), А затем мне нужно найти все сообщения, где есть на листе один из всех этих вещей ... – nowiko

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