2014-09-07 2 views
0

Я пытаюсь получить все строки в моей таблице, но с пользовательскими фильтрами (где условия).laravel elequent query с несколькими условиями на основе поиска/фильтра

Таблица выглядит следующим образом: news: id, category, type, body, is_active

Я хочу, чтобы пользователь фильтровать их по: type и is_active

Так я использую

if(Input::get("is_active")) News::where("is_active", 1)->get();

if(Input::get("type")) News::where("type", Input::get("type"))->get();

if(Input::get("category")) News::where("category", Input::get("category"))->get();

Как я могу запустить все условия по тому же запросу? Я не хочу делать if/else для каждого условия и перезаписывать запрос снова и снова!

ответ

2

Таким образом:

$query = News::newQuery(); 

if(Input::get("is_active")) 
    $query->where("is_active", 1)->get(); 

if(Input::get("type")) 
    $query->where("type", Input::get("type"))->get(); 

if(Input::get("category")) 
    $query->where("category", Input::get("category"))->get(); 

return $query->get(); 
0

Попробуйте

News::where("is_active", 1) 
    ->where('type', Input::get("type")) 
    ->where('category', Input::get("category")) 
    ->get(); 

или если вы хотите только активные новости с другими или условиями.

News::where("is_active", 1) 
    ->orWhere(function($query) 
     { 
      $query->where('type', Input::get("type")) 
        ->where('category', Input::get("category")) 
     })->get(); 

Заканчивать advanced where

1

Вы можете передать замыкание на where()

Попробуйте это:

$filters = ['is_avtive', 'type', 'category']; 

News::where(function($q) use ($filters){ 

    foreach($filters as $field) 
     $q->where($field, Input::get($field)); 

})->get(); 
Смежные вопросы