2013-07-27 56 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不为null)这样的事情

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,不客气,不要忘记与社区分享更好的想法,分享让事情变得更好。 :-) –