仅当变量存在时才在 Eloquent 查询中包含子句
Including a clause in an Eloquent query only if variable exists
我有一个提取 GET 请求数据的页面。
所以我有:example.com/page?filter1=1&filter2=false
根据要求,有时可能会有 filter3
或 filter4
或多个 'filters' 的任意组合。
在我的控制器中执行 Input::all();
然后想查询我的 model/database.
例如:User::where('filter1', '=' , Input::get('filter1'));
这只是一个例子。如何根据 GET 请求中存在的过滤器动态添加到该查询?
这些过滤器将过滤数据,我希望所有返回的行都包含所有这些过滤器。
如有任何帮助,我们将不胜感激!
谢谢!
如果过滤器的命名与数据库字段完全相同,您可以将它们作为数组传递给 where()
。
我建议使用 except()
,这样您就可以控制过滤后的属性。
$filters = Input::except('filter1', 'filter2', 'filter3');
$users = User::where($filters)->get();
如果过滤器名称并不总是匹配,或者您需要与 =
不同的运算符,您可以像这样有条件地添加 where:
$query = User::where('foo', 'bar');
if(Input::has('one')){
$query->where('filter1', '>', Input::get('one'));
}
$users = $query->get();
如果你没有无条件的地方并且需要一些东西 "to start with" 你可以只使用 query()
:
$query = User::query();
// add wheres...
您可以将所有 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();
这是一个很常见的问题,我创建了一个包来自动管理它,不费吹灰之力。
试试吧!
https://github.com/ferpetrelli/scoped-controller
这是来自 RoR 的 gem has_scope 的简化版本。
我有一个提取 GET 请求数据的页面。
所以我有:example.com/page?filter1=1&filter2=false
根据要求,有时可能会有 filter3
或 filter4
或多个 'filters' 的任意组合。
在我的控制器中执行 Input::all();
然后想查询我的 model/database.
例如:User::where('filter1', '=' , Input::get('filter1'));
这只是一个例子。如何根据 GET 请求中存在的过滤器动态添加到该查询?
这些过滤器将过滤数据,我希望所有返回的行都包含所有这些过滤器。
如有任何帮助,我们将不胜感激!
谢谢!
如果过滤器的命名与数据库字段完全相同,您可以将它们作为数组传递给 where()
。
我建议使用 except()
,这样您就可以控制过滤后的属性。
$filters = Input::except('filter1', 'filter2', 'filter3');
$users = User::where($filters)->get();
如果过滤器名称并不总是匹配,或者您需要与 =
不同的运算符,您可以像这样有条件地添加 where:
$query = User::where('foo', 'bar');
if(Input::has('one')){
$query->where('filter1', '>', Input::get('one'));
}
$users = $query->get();
如果你没有无条件的地方并且需要一些东西 "to start with" 你可以只使用 query()
:
$query = User::query();
// add wheres...
您可以将所有 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();
这是一个很常见的问题,我创建了一个包来自动管理它,不费吹灰之力。
试试吧!
https://github.com/ferpetrelli/scoped-controller
这是来自 RoR 的 gem has_scope 的简化版本。