はじめに
クエリパラメータの値を用いて処理したデータを返す際、クエリパラメータの指定がない場合はあるデフォルト値を設定しておく必要がありました。
そのため備忘録として、実際に使用したクエリからのデータの取得方法と、デフォルト値設定に関して注意しておく点をまとめます。
内容について、お気づきの点がございましたら、お教えいただけますと幸いです。
クエリからの取得
https://example.com/api/users?id=123&name=john
というAPIエンドポイントでリクエストが送られてきた場合について考えてみます。
今回はLaravelが提供するRequestクラスを利用してクエリから取得します。Illuminate\Http\Request
をインポートして、メソッドの引数に$requestを渡し、メソッド内で$request->query();
の記述でクエリパラメータの値を取得することができます。
また、$request->query('キー名');
だとキーを指定して値を取得することができます。
Laravel API Illuminate\Http\Request
use Illuminate\Http\Request;
class SearchController extends Controller
{
public function search(Request $request)
{
// クエリパラメータ全体を連想配列として取得
$allParams = $request->query();
// $allParams の中身: ['id' => '123', 'name' => 'john']
// 特定のパラメータを取得
$id = $request->query('id'); // '123' を取得
$name = $request->query('name'); // 'john' を取得
}
}
デフォルト値の設定
queryメソッドの第二引数にデフォルト値を指定
Illuminate\Http\Request
クラスが提供するquery
メソッドの第二引数にはデフォルト値を指定することができ、クエリパラーメータに指定したキーがない場合はデフォルト値を設定しておくことができます。
use Illuminate\Http\Request;
class SearchController extends Controller
{
public function search(Request $request)
{
// キーが存在しない場合のデフォルト値を指定することもできる
$category = $request->query('category', 'food');
// 'category'がなければ 'food' を返す
}
}
もし、categoryキーがなければ、'food'
を返します
今回クエリでの指定がなければ、ある特定の値をデフォルト値として処理を進める仕様だったため、
別ファイルにenumを設定して整数値を第二引数に指定するようにしていました。
enum Category: int
{
case Food = 1;
}
use Illuminate\Http\Request;
use ~\Category;
class SearchController extends Controller
{
public function search(Request $request)
{
// キーが存在しない場合のデフォルト値を指定することもできる
$category = $request->query('category', Category::Food->value);
// 'category'がなければ enum値を返す
}
}
動作確認をしたところ正常に動作しましたが、CIエラーに引っかかりました。
エラー内容としては、query
メソッドの第二引数は文字列、配列、nullの型のいずれかを期待しているといったものでした。
公式のIlluminate\Http\Request
クラスの説明にも第二引数の型について明確に説明がありました。
string|array|null
query(string|null $key = null, string|array|null $default = null)
Retrieve a query string item from the request.
Laravel API Illuminate\Http\Request
注意点
先ほどのエラーの通り、queryメソッドの第二引数は整数値を指定するのではなく、文字列、配列、nullの型のいずれかで指定してあげる必要があります。
今回は、整数値を文字列にキャストしてあげるか、enumの値を元から文字列で設定しておくことで解決しました。
// キャストする場合
use Illuminate\Http\Request;
use ~/Category;
class SearchController extends Controller
{
public function search(Request $request)
{
// Category::Food->value で数値の1を取得し、(string)で文字列にキャスト
$category = $request->query('category', (string) Category::Food->value);
}
}
まとめ
Laravelでクエリからデータを取得する方法とクエリのデフォルト値を設定する方法や注意点についてまとめました。
メソッドの返り値の型に関して、確認して理解しながら実装することが必要だと勉強になりました。