2013-03-01 1 views
1

Я пытаюсь найти два дополнительные таблицы с использованием красноречиво:Laravel Красноречивого поиск два необязательные поля

$users = User::where('ProfileType', '=', 2) 
       ->where(function($query) { 
        $query->where('BandName', 'LIKE', "%$artist%"); 
        $query->or_where('Genre', 'LIKE', "%$genre%"); 
       })->get(); 

Это прекрасно работает для возвращения всех результатов, когда пользователь делает пустой поиск, но я не знаю, как отрегулируйте это для поиска имени диапазона, когда это присутствует, и наоборот.

+0

Так будет запрос всегда: WHERE ('бар' BandName = 'Foo' или жанр =) Profiletype = 2 И? Я пытаюсь выяснить, какие значения поиска всегда будут присутствовать и какие из них не всегда существуют. –

+0

Да, ProfileType всегда будет присутствовать, но BandName и Genre являются необязательными и даже могут быть пустыми. Спасибо – tmartin314

ответ

2

Опираясь на ответ Виниций вот что сработало:

// Instantiates a Query object 
$query = User::where('ProfileType', '=', '2'); 

// Adds a clause to the query 
if ($artist = Input::get('artist')) { 
    $query->where('BandName', 'LIKE', "%$artist%"); 
    // Temp Usernamesearch 
    $query->or_where('NickName', 'LIKE', "%$artist%"); 
} 

// Genre - switch function if artist is not empty 
if ($genre = Input::get('genre')) { 
    $func = ($artist) ? 'or_where' : 'where'; 
    $query->$func('Genre', 'LIKE', "%$genre%"); 
} 

// Executes the query and fetches it's results 
$users = $query->get(); 

Оказывается, что второе дополнительное поле необходимо использовать or_where только если $ художник не установлен.

Спасибо за вашу помощь

0

Я думаю, что это то, что вы после. Ваше представление будет иметь форму для поиска исполнителя/жанра, который может быть установлен, или обоих, или ни одного.

$users = User::where('ProfileType', '=', 2); 

if (Input::has('artist')) { 
    $users = $users->where('BandName', 'LIKE', '%'.Input::get('artist').'%'); 
} 

if (Input::has('genre')) { 
    $users = $users->where('Genre', 'LIKE', '%'.Input::get('genre').'%'); 
} 

$users = $users->get(); 
8

Просто, чтобы объяснить, что происходит на ответ ниже:

Eloquent делает сложную вещь здесь: Когда вы звоните User::where(...) он возвращает Database\ Query объект. Это в основном то же самое, что и DB::table('users')->where(...), цельный объект для построения SQL-запросов.

Так наличие:

// Instantiates a Query object 
$query = User::where('ProfileType', '=', '2'); 
$query->where(function($query) { 
    // Adds a clause to the query 
    if ($artist = Input::get('artist')) { 
     $query->where_nested('BandName', 'LIKE', "%$artist%", 'OR'); 
    } 
    // And another 
    if ($genre = Input::get('genre')) { 
     $query->where_nested('Genre', 'LIKE', "%$genre%", 'OR'); 
    } 
}); 

// Executes the query and fetches it's results 
$users = $query->get(); 
+0

Этот ответ выглядит хорошо, но по какой-то причине не находит никаких результатов. Не знаю, в чем проблема – tmartin314

+0

Ow, я не понимал, что вы хотите искать несколько полей с OR. Обычно каждое поле ведет себя как фильтр. В этом случае И - путь. Я отредактирую ответ и поясню. – vFragosop

+0

Можно ли это сделать в одном поле ввода? Например, фильтр имен, который проверяет, равен ли фильтр первому имени или имени ... – nclsvh

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

  • Нет связанных вопросов^_^