2017-02-27 4 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); 
} 

これは動作しますが、それは汚いです:(

だから、私はif文内のすべての静的呼び出しを行う必要はありませんので、variabelにモデルを保存することは可能でしょうか?

答えて

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

'モデル::クエリ() 'クエリを取得するためですので、私は初めに、静的なコールを持っていますbuilder –

+0

これを最初の行に置き換えると、私はこの答えを正しいものとして設定します。 – mimo

1

どこの関数でフィルタを作成することができます。これにより、それらをまとめて素早くグループ化します。例えば

$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(); 
関連する問題