Laravel 5 - 使用请求对象数据获取参数时限制Eloquent的参数

时间:2016-11-03 18:03:05

标签: laravel laravel-5 eloquent laravel-5.2

我的控制器功能如下:

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表,其中包含列(idnamedescription)。我传入的GET网址如下:

GET /user?name=mike&description=skinny&age=45

上面的URL中有三个参数,但只有两个是有效的列名。我希望自动取出age参数。在我当前的代码中,由于age列不存在,上述URL将返回错误响应。

3 个答案:

答案 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()进行过滤。

https://github.com/Tucker-Eric/EloquentFilter

答案 2 :(得分:0)

尝试做这样的事情:

public function get(Request $request)
{
    $user = new User();

    return User::where(
        $request->only($user->getFillable())
    )->get()->toArray();
}

通过创建User的实例,您可以使用fillable访问它的getFillable()属性。通过将此列表传递到$request->only(...),您可以将您提取的值限制为仅在可填充数组中的值。希望这应该意味着只有可填充的值才会被视为查询的一部分。

希望它有所帮助。