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