动态生成diff数为“where”的查询?

时间:2017-11-16 21:36:26

标签: php laravel laravel-5 eloquent laravel-eloquent

如果我不知道过滤器更新多少,我如何动态生成对数据库的查询 - 值将在 $ filters $ updates 数组? 查询模板如下:

$model::where($key_1, '=', $filter1)
    ->where($key_2, '=', $filter_2)
    ->where($key_n, '=', $filter_n)
    ->update([$key_1 => $update_1,
        $key_2 => $update_2,
        $key_n => $update_n
    ]);

3 个答案:

答案 0 :(得分:0)

循环遍历数组并为每个过滤器调用每个方法:

foreach($filters as $key =>$value){
   $model->where($key, $value);
}

然后以相同的方式构建您的$updates数组并调用update:

$model->update($updates);

答案 1 :(得分:0)

我使用并推荐查询范围。 它可以保持代码的清洁和可读性,同时还可以重用代码。

在我的模型User中,我将创建一个名为scopeFilter

的函数
public function scopeFilter($query, $params)
{
    if(isset($params['status']) && trim($params['status']) !== '')
    {
        $query->where('status', '=', trim($params['status']));
    }

    if(isset($params['is_admin']) && is_bool($params['is_admin']))
    {
        $query->where('is_admin', '=', $params['is_admin'] ? '1' : '0');
    }
    return $query;
}

在我的ApiUsersController我只会使用此来电,请注意拨打电话时会忽略字scope

public function index(Request $request)
{
    $users = User::filter($request->all())->get();

    return Response::make([
        'success' => true,
        'data'    => $users
        ]);
}

现在,在您的情况下,您可以在scopeFilter中循环播放

foreach ($params as $key->$param) {
    $query->where($key, '=', $param);
}

这是为了让您了解我是如何做到这一点并保持代码清洁。

另请阅读Laravel文档here中的本地范围。恕我直言,这是实现过滤的最简洁方法。

答案 2 :(得分:0)

您可以使用参数分组:

$model::where(function ($query) use ($filters) {
            foreach($filters as $filter) {
                $query->where($filter->column, '>', $filter->value);
            }
            return $query;
        })

...