LaravelでAPIをつくっています。
リクエストのパラメータをLaravelのクエリビルダを使って検索条件にしているのですが、そのパラメーターが入っているかどうかを判断してクエリービルダーに付加するには【WHENメソッド】といった便利な機能があります。
そのWHENメソッドを自分なりに使った方法についてメモ。
WHENメソッドとは
ある条件がtrueの場合の時のみ、クエリへ特定の文を適用したい場合があります。例えば特定の入力値がリクエストに含まれている場合に、where文を適用する場合です。whenメソッドで実現できます。
最低・最高金額の絞り込みをするクエリ
リクエストのパラメータに最低金額(MIN_PRICE)と最高金額(MAX_PRICE)が含まれたときだけ、WHENメソッドを使いクエリビルダに付加するサンプルです。
// 変数初期値
$PRICE_CHECK = false;
$MIN_PRICE = 0;
$MAX_PRICE = 10000000000;
$orderby = 'asc';
// パラメータを取得
$param = $request->all();
// MIN_PRICEとMAX_PRICEのパラメータがあるかチェックして処理
if ( isset($param['MIN_PRICE'])) {
$MIN_PRICE = $param['MIN_PRICE'];
$PRICE_CHECK = true;
}
if ( isset($param['MAX_PRICE'])) {
$MIN_PRICE = $param['MAX_PRICE'];
$PRICE_CHECK = true;
}
// クエリビルダ
$items =
Product::where('name',"{$model}")
->orderBy('price', "{$orderby}")
->when($PRICE_CHECK, function ($query) use ($MIN_PRICE, $MAX_PRICE) {
return $query->whereBetween('price', [$MIN_PRICE, $MAX_PRICE]);
})
->get();
解説
クエリビルダにWHENメソッドを付けています。
第1引数に$PRICE_CHECKを割り当てており、変数初期値ではfalseになっていますが、【MIN_PRICEとMAX_PRICEのパラメータがあるかチェックして処理】のところで、パラメータにどちらか一方でも存在するときは、$PRICE_CHECK = trueとしています。
なので、MIN_PRICEかMAX_PRICEが存在する時はWHEN節のクエリが実行されます。
use ($MIN_PRICE, $MAX_PRICE)は、クロージャで利用する変数を渡すために使います。
ちなみに、第1引数がfalseだったときに第3引数に別のクロージャを渡すこともできます。
データベース:クエリビルダ 5.3 Laravel
まとめ
現在作成しているLaravelを使ったAPIは、パラメータの組み合わせによってクエリも変わってくるのですが、他の人がどうやっているのか知りたいです。