具有多个入口点的查询生成器
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();
我有不同的过滤器要用于我的模型,但它们都是可选的。
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();