2014-11-17 5 views
1

У меня есть расширенная форма поиска для фильтрации результатов из базы данных с использованием Laravel. Данные фильтруются правильно, но у меня есть требование, чтобы пользователь мог фильтровать по имени или фамилии, используя одно и то же текстовое поле (в расширенной форме). Я попробовал orWhere, чтобы убедиться, что он фильтрует поле имени с именем или фамилией, но orWhere не учитывает другие фильтры. Код, я использую выглядит следующим образом:Laravel: расширенный запрос формы поиска

DB::table('mytable') 
       ->where(function($query) use ($name, $degree_s, $specialty_s, $city_s, $state_s, $lundbeck_id_s) { 

       if ($name) 
        $query->where('first_name', 'like', "$name%")->orWhere('last_name', 'like', "$name%"); # this is whats causing the issue 
       if ($specialty_s) 
        $query->where('primary_specialty', $specialty_s); 
       if ($city_s) 
        $query->where('city', $city_s); 
       if ($state_s) 
        $query->where('state_province', $state_s); 
       if ($lundbeck_id_s) 
        $query->where('customer_master_id', $lundbeck_id_s); 
       if ($degree_s) 
        $query->where('primary_degree', $degree_s); 
       }) 

       ->select('id', 'first_name','last_name') 

Добавление пункт orWhere вызывает запрос не использовать другие условия, а также (как city_s или state_s).

ответ

2

Вам нужно изменить:

if ($name) 
    $query->where('first_name', 'like', "$name%")->orWhere('last_name', 'like', "$name%"); 

в:

if ($name) { 
    $query->where(function($q) use ($name) { 
     $q->where('first_name', 'like', "$name%")->orWhere('last_name', 'like', "$name%"); 
    }); 
} 

сделать Laravel добавить скобки, он будет работать, как вы ожидаете.

EDIT

Конечно, вам не нужно обернуть все с закрытием здесь, поэтому лучшим решением для этого будет:

<?php 

$query = DB::table('mytable')->select('id', 'first_name', 'last_name'); 

if ($name) { 
    $query->where(function ($q) use ($name) { 
     $q->where('first_name', 'like', "$name%") 
      ->orWhere('last_name', 'like', "$name%"); 
    }); 
} 
if ($specialty_s) { 
    $query->where('primary_specialty', $specialty_s); 
} 
if ($city_s) { 
    $query->where('city', $city_s); 
} 
if ($state_s) { 
    $query->where('state_province', $state_s); 
} 
if ($lundbeck_id_s) { 
    $query->where('customer_master_id', $lundbeck_id_s); 
} 
if ($degree_s) { 
    $query->where('primary_degree', $degree_s); 
} 

$data = $query->get(); 
+0

Большое спасибо Marcin, это было решение, которое я внедрил –

1

я буду строить запрос немного по-другому.

$q = DB::table('mytable')->select(['id', 'first_name', 'last_name']); 

if(!empty($name)) 
{ 
    $q->where(function($query)use($name){ 
     $query->where(('first_name', 'like', "$name%") 
       ->orWhere('last_name', 'like', "$name%"); 
    }); 
} 

if(!empty($specialty_s) $q->where('primary_specialty', $specialty_s); 

до сих пор .... так далее.

наконец

возвращения q->get() или $q->paginate(30) в зависимости от ваших потребностей.

+0

Он не будет работать должным образом. Он будет создавать запрос 'где A или B AND C' –

+0

gosh .... как я не мог его увидеть! обновлено .... – itachi

+0

Вы также забыли о добавлении 'use ($ name)' к вашему закрытию –

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