仅当变量存在时才在Eloquent查询中包含子句

时间:2015-04-23 11:29:29

标签: php laravel eloquent

我有一个拉取GET请求数据的页面。

所以我有:example.com/page?filter1=1&filter2=false

根据请求,有时可能会有filter3filter4或多个'过滤器的任意组合。

在我的控制器中执行Input::all();,然后希望查询我的模型/数据库。

例如:User::where('filter1', '=' , Input::get('filter1'));

这只是一个例子。如何根据GET请求中存在哪些过滤器动态添加到该查询?

这些过滤器将过滤数据,我希望所有返回的行都包含所有这些过滤器。

任何帮助将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:7)

如果过滤器的命名与db字段完全相同,则可以将它们作为数组传递给where()

我建议使用except(),以便您可以控制已过滤的属性。

$filters = Input::except('filter1', 'filter2', 'filter3');
$users = User::where($filters)->get();

如果过滤器名称不匹配,或者您需要的运营商与=不同,则可以添加有条件的地址:

$query = User::where('foo', 'bar');
if(Input::has('one')){
    $query->where('filter1', '>', Input::get('one'));
}
$users = $query->get();

如果你没有无条件的地方并需要一些东西"从"开始您只需使用query()

$query = User::query();
// add wheres...

答案 1 :(得分:2)

您可以动态地将所有where() - s添加到查询中,在完成构建查询后,只需使用get()来获取相应的集合。

$query=User::where(where("filter1", Input::get("filter1"));
if(Input::has("filter2")) {
  $query=$query->where("filter2", Input::get("filter2"));
}
$users=$query->get();

答案 2 :(得分:0)

这是一个非常常见的问题,我创建了一个程序包来轻松管理它。

试试看!

https://github.com/ferpetrelli/scoped-controller

这是RoR提供的gem has_scope的简化版本。