URLの「クエリパラメータ(GETパラメータ)」は、検索画面の絞り込みやページネーション、ソートなどで使われます。
単一の値を扱う場合は ?key=value を & で繋ぐだけなのでシンプルですが、「複数の値(配列データ)」を扱う場合、Web全体で統一された唯一の標準ルール(RFCによる厳密な定義)は存在しません。
今回は、複数値を扱う一般的な4つの形式についてまとめました。
クエリパラメータの基本と役割
パラメータは ? から始まり、2つ目以降の条件は & で繋ぐのがWebの基本です。
/search?skill=react&workPlace=tokyo&sort=newest
クエリパラメータに適しているもの・適していないもの
設計の段階で、そもそもそのデータをURLに含めるべきかどうかの判断が必要です。
| 適しているもの(URLで共有・保持したい状態) | 適していないもの(Bodyなどで送るべきデータ) |
|---|---|
| 🔍 検索の絞り込み条件(フィルター) | 📝 ユーザーが入力した長大なテキスト(ブログ本文など) |
📄 ページネーション(page=2 など) |
🔒 パスワードやクレジットカードなどの機密情報 |
📊 並び替え条件(sort=price_desc など) |
🧬 複雑にネストされた巨大なJSONデータ |
複数値(配列)を表す4つのアプローチとLaravelでの挙動
実務でよく使われる、複数値をURLで表現する4つの形式を比較します。
1. ブラケット形式(Brackets)
💡 Laravel環境で推奨
キー名の末尾に [] を付けて値を並べる形式です。
/search?skills[]=react&skills[]=laravel&skills[]=php
- 特徴: PHPやRuby on Railsなどの文化圏で深く浸透している、事実上の標準(デファクトスタンダード)です。
-
Laravelでの挙動: バックエンド(内部のSymfony Request)が受け取った時点で、何の前処理も必要とせず自動的にPHPの
arrayとしてパースしてくれます。FormRequestでのバリデーションとも非常に相性が良いです。
2. 同名キーの繰り返し形式(Repeat parameters)
⚠️ PHP環境では注意
[] を付けず、同じキー名を何度も並べる形式です。
/search?skills=react&skills=laravel&skills=php
-
特徴: Java(Spring Boot)、Go言語、またはブラウザ標準の
URLSearchParamsAPIなどでは標準的な配列表現として扱われます。言語に依存しないシンプルなURLを保ちたい場合に採用されます。 -
Laravelでの挙動: PHPの標準仕様(
parse_str等の挙動)により、同名キーが連続すると「最後に書かれた値(上記ならphp)」で上書きされてしまいます。Laravelでこれを取り出すには、未加工の生のクエリ文字列から独自のパースロジックを書く必要があり、保守性が下がりやすいため推奨されません。
3. カンマ区切り形式(Comma-separated)
1つのキーに対し、値をカンマ , で連結して1本の文字列にする形式です(CSV形式)。
/search?skills=react,laravel,php
- 特徴: OpenAPI(Swagger)等でサポートされており、URLを短く美しく保ちたい場合に好まれます。
-
Laravelでの挙動: サーバー側が受け取った時点では、ただの
"react,laravel,php"という「1本の文字列」です。そのため、バリデーションや処理に回す前に、手動でexplode(',', $request->input('skills'))のように配列へ分解する前処理が必要になります。また、値自体にカンマが含まれる可能性がある場合はエスケープ処理の考慮が必要です。
4. 【非推奨】縦線(パイプ)区切り形式
値を縦線 | で連結する形式です。
/search?skills=react|laravel|php
-
|はURLの仕様上、多くのクライアントやライブラリで%7CにURLエンコードされるため、URLの可読性やデバッグ時の視認性が低下します。また、Laravel開発においてはコード中のバリデーションルールの区切り文字(required|string)と記号が同じであるため、開発者の混乱を招きやすく、可読性を下げる原因になります。