我的laravel网站上有一系列新闻报道。在/news/
页面上会显示一个快速的故事列表。
现在我想让用户过滤新闻。例如,只显示“体育”故事。
在我的控制器中我这样做了:
$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
这样的东西 - 那我该怎么做?
我知道我必须在这里遗漏一些明显的东西。有人能指出我正确的方向吗?
答案 0 :(得分: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);