【问题标题】:Laravel: Filtering in eloquent with optional user inputLaravel:使用可选的用户输入进行 eloquent 过滤
【发布时间】:2013-07-27 23:07:43
【问题描述】:

我的 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 之类的东西——那我该怎么办?

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

【问题讨论】:

  • 你应该使用 URI 作为路由参数,而不是通过 GET。

标签: php variables laravel eloquent


【解决方案1】:

我认为你可以使用 foreach 循环来实现,例如

$input = Input::all();

所以,你会得到这样的东西(你应该检查$input 不为空)

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

现在,选择表格

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

现在loop$inputlike(用于多个动态where子句)

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

或者你可以使用orderBylike(用于多个动态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);

【讨论】:

  • 谢谢,'打破链条'是要走的路。我最终没有使用你的循环,但你让我朝着正确的方向前进。
  • @Jay,欢迎您,不要忘记与社区分享更好的想法,分享让事情变得更好。 :-)
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2017-12-24
  • 2020-06-24
  • 2017-02-19
  • 2017-11-05
  • 2023-03-10
相关资源
最近更新 更多