2013-07-27 1 views
4

У меня есть список новостей на моем сайте laravel. На странице /news/ показан быстрый список историй.Laravel: Фильтрация в красноречиве с дополнительным пользовательским вводом

Теперь я хочу разрешить пользователям фильтровать новости. Например, показывают только «спортивные» истории.

В моем контроллере я сделал это:

$input = Input::all(); 

$events = DB::table('news') 
     ->where('category', '=', $input['type']) 
     ->order_by('created_at', 'desc') 
     ->paginate(10); 

Теперь, это позволяет мне посетить /news?type=sports и это показывает только правильно новости в рамках спортивной категории. Это работает только в том случае, если задан тип, и, очевидно, будет терпеть неудачу, если нет указанного типа.

Какое это лучшее решение? Я знаю, что могу проверить, существует ли $input['type'], и если да, напишите совершенно новый, второй код "$news = DB::table('news')...", но я думаю, что я действительно хочу иметь несколько пользовательских входов, что сделает этот параметр неработающим. Например, что, если я хочу сортировать по типу и местоположению? Что-то вроде /news?type=sports&area=chicago - что бы я тогда сделал?

Я знаю, что, должно быть, мне не хватает чего-то очевидного. Может кто-то указать мне верное направление?

+1

Вы должны быть используя URI, хотя, как параметр маршрута, вместо того, чтобы иметь его через GET. – rmobis

ответ

3

Я думаю, что вы можете сделать это с помощью foreach цикла, например

$input = Input::all(); 

Таким образом, вы получите что-то вроде этого (вы должны проверить $input не равно нулю)

Array 
(
    [type] => sports 
    [area] => chicago 
) 

сейчас , выберите таблицу, такую ​​как

$events = DB::table('news'); 

loop$input как (для многократного динамического where п)

foreach ($input as $key => $value) { 
    $events->where($key, $value); 
} 
$result = $users->get(); 

Или вы можете использовать orderBy как (для многократного динамического orderBy п)

$events = DB::table('news')->where('category', $input['type']); 
foreach ($input as $key => $value) { 
    $events->orderBy($key); // also, you can use ASC/DESC as second argument 
} 
$result = $users->get(); 

или вы можете использовать

$result = $users->paginate(10); 
+0

Спасибо, «сломать цепь» - это путь. Я не использовал ваш цикл, но вы поставили меня в правильном направлении. – Jay

+1

@ Jay, Добро пожаловать и не забывайте делиться лучшими идеями с сообществом, обмен делает вещи лучше. :-) –

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

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