memo

リクエストパラメータによってクエリビルダに条件付で付加するWHENメソッドについて

LaravelでAPIをつくっています。

リクエストのパラメータをLaravelのクエリビルダを使って検索条件にしているのですが、そのパラメーターが入っているかどうかを判断してクエリービルダーに付加するには【WHENメソッド】といった便利な機能があります。

そのWHENメソッドを自分なりに使った方法についてメモ。

WHENメソッドとは

ある条件がtrueの場合の時のみ、クエリへ特定の文を適用したい場合があります。例えば特定の入力値がリクエストに含まれている場合に、where文を適用する場合です。whenメソッドで実現できます。

データベース:クエリビルダ 5.3 Laravel

最低・最高金額の絞り込みをするクエリ

リクエストのパラメータに最低金額(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は、パラメータの組み合わせによってクエリも変わってくるのですが、他の人がどうやっているのか知りたいです。