我的控制器功能如下:
public function get(Request $request){
return json_encode($this->users->get($request->all));
}
其中$this->users
引用了我的User
模型的存储库。在这个存储库里面,我有一个看起来像这样的函数:
public function get($request){
return User::where($request)->get()->toArray();
}
我可以动态传入任意数量的参数,通过我的HTTP请求使用上面的代码进行搜索,而无需明确说明列名。
只要通过请求传入的所有参数都是有效的列名,这都可以正常工作。如果我传入一个无效的表列参数,它将会出错。
我的每个模型中都定义了protected $fillable
数组,对应于我的存储库。
是否有强制执行上述where()
方法的内容,以便只传入模型中$fillable
数组中定义的有效列?
例如,我们假设我有一个users
表,其中包含列(id
,name
,description
)。我传入的GET网址如下:
GET /user?name=mike&description=skinny&age=45
上面的URL中有三个参数,但只有两个是有效的列名。我希望自动取出age
参数。在我当前的代码中,由于age
列不存在,上述URL将返回错误响应。
答案 0 :(得分:1)
您可以使用array_only()
帮助:
return User::where(array_only($request, $this->fillable))->get()->toArray();
它将过滤$request
并仅保留$fillable
数组中的键/值对。
如果此代码不在模型中,请将$this->fillable
更改为适当的变量或方法调用。
答案 1 :(得分:0)
我写了一个包,用于对模型进行这种过滤。它允许您在定义每个可能列的User::filter($request->all())->get();
约束时基于where()
进行过滤。
答案 2 :(得分:0)
尝试做这样的事情:
public function get(Request $request)
{
$user = new User();
return User::where(
$request->only($user->getFillable())
)->get()->toArray();
}
通过创建User
的实例,您可以使用fillable
访问它的getFillable()
属性。通过将此列表传递到$request->only(...)
,您可以将您提取的值限制为仅在可填充数组中的值。希望这应该意味着只有可填充的值才会被视为查询的一部分。
希望它有所帮助。