Laravel:通过可选的用户输入过滤

时间:2013-07-27 23:07:43

标签: php variables laravel eloquent

我的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这样的东西 - 那我该怎么做?

我知道我必须在这里遗漏一些明显的东西。有人能指出我正确的方向吗?

1 个答案:

答案 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);