2017-02-27 39 views
1

我有不同的过滤器,我想用于我的模型,但它们都是可选的。具有多个入口点的查询生成器

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); 
} 

这会工作,但它的肮脏:(

所以是有可能保存模型到variabel所以我没有做一个静态调用里面所有的if语句?

回答

2

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); 
}); 
+0

我只加了'ID <> -1'所以我必须在开始时静态调用所以它仍然是脏 – mimo

+1

'型号::查询()'来得到查询建设者 –

+0

如果你想用第一行替换这个,我会把这个答案设置为正确的。 – mimo

1

你可以在一个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();