2017-02-06 3 views
1

Мне нужно создать запрос с Doctrine QueryBuilder используя Еогеасп заявление, в настоящее время, следующие один используется, но не является самым правильным:

// $query object 
foreach ($searches as $value) { 
       $query->andWhere($query->expr()->orX(
        $query->expr()->eq('c.firstName', ':name'), 
        $query->expr()->eq('c.lastName', ':name') 
       ))->setParameter('name', $value); 
      } 

это дает я:

.... ГДЕ .... И (? a0_.first_name = OR a0_.last_name =) И (? a0_.first_name = OR a0_.last_name =) ORDER BY a0_. first_name ASC

, в то время как мне нужно:

... ГДЕ ..... И (a0_.first_name =? ИЛИ a0_.last_name =? ИЛИ a0_.first_name =? ? ИЛИ a0_.last_name =) ORDER BY a0_.first_name ASC

мне нужно что-то вроде этого, но PHP Безразлично»позволяют это конечно:

// $query object 

        $query->andWhere($query->expr()->orX(
        foreach ($searches as $value) { 
         $query->expr()->eq('c.firstName', ':name'), 
         $query->expr()->eq('c.lastName', ':name') 
         } 
        ) 
        )->setParameter('name', $value); 

Не могли бы вы помочь мне использовать оператор Еогеасп чтобы достичь моей цели. Ваша обычная помощь приветствуется.

+1

Это не имеет никакого смысла. Что вы ожидаете от запроса типа 'a0_.first_name =? ИЛИ a0_.first_name =? '? 20 повторений так же хороши, как один «a0_.first_name =?» –

+0

Забудьте о цикле. Используйте Laravel ['whereIn()'] (https://laravel.com/docs/5.4/queries#where-clauses) –

+0

@AlexBlex, $ search - это массив, исходящий из preg_split. Я должен использовать каждое значение массива в качестве поиска по имени и фамилии –

ответ

1

Для всех нуждающихся в одно из решений:

if (!empty($search)) { 
         $orX = $query->expr()->orX(); 
         $i=0; 
         foreach ($searches as $value) { 
          $orX->add($query->expr()->eq('c.firstName', ':name'.$i)); 
          $orX->add($query->expr()->eq('c.lastName', ':name'.$i)); 
          $query->setParameter('name'.$i, $value); 
       $i++; 
       } 
       $query->andWhere($orX); 
      } 
+0

Это не похоже, что это будет работать очень хорошо. Может быть, я не понимаю вашу цель. –

+0

@StuartWagner, это работает сэр; и я скажу вам, почему WhereIn не работает для меня. но не могли бы вы рассказать мне, что может быть проблемой при использовании чего-то подобного? Thanks –

+2

Вы уверены, что работает так, как вы ожидаете? Вы используете один параметр ': name' и перезаписываете его на каждой итерации. –

0

Привет, вы можете использовать эту aproche с помощью CONCAT и в массиве

->where("CONCAT(CONCAT(c.firstName, '_'),c.lastName) IN (:names)")->setParameter('names', $names) 

переменной $ имен как это

array(firstName_lastName,firstName1_lastName,firstName2_lastName2,...); 
Смежные вопросы