如果我不知道过滤器和更新多少,我如何动态生成对数据库的查询 - 值将在 $ 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
]);
答案 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;
})
...