具有多个入口点的查询生成器

Query Builder with multiple entry points

我有不同的过滤器要用于我的模型,但它们都是可选的。

if($foo) {
    $model = Model::where('id', 1);
}
if($bar) {
   $model = $model->where('age', 3);
}

因此,如果第一个语句成功,此代码只会 运行。

$model = Model::where('id', '<>', -1);
if($foo) {
    $model->where('id', 1);
}
if($bar) {
   $model->where('age', 3);
}

这可行,但它很脏:(

那么是否可以将模型保存到变量中,这样我就不必在所有 if 语句中进行静态调用?

https://laravel.com/api/5.4/Illuminate/Database/Eloquent/Model.html#method_query

https://laravel.com/api/5.4/Illuminate/Database/Query/Builder.html#method_when

Model::query()->when($foo, function ($query) {
    $query->where('id', 1);
})->when($bar, function ($query) {
    $query->where('age', 3);
});

您可以在 where 函数中创建过滤器,这会将它们很好地组合在一起。

例如:

$models = Model::where(function ($query) use ($request) {
    $query->where('id', '<>' -1);

    if ($request->has('id')
        $quer->where('id', $request->id);

    if ($request->has('age'))
        $query->where('age', $request->age);

})->get();