Laravelで検索結果一覧の並び替え、絞り込みを実装しました。
商品一覧を表示するページで、GETパラメータは3つです。
・ order 並び順 (価格の安い順、価格の高い順、発売日 など)
・ kind「商品の種類」
・ used「中古かどうか」
(例) 商品の種類が3で、かつ中古の商品を、価格の安い順に並びて表示
?kind=3&used=true&order=price_low
※ 実際はキーワード検索もあるので keyword というパラメータも存在
※ ページネーションしているので page パラメータも存在
発生している問題
(例)の状態から「価格の高い順」をクリックすると以下のようにorderが重複してしまう。
?order=price_low&kind=3&used=true&order=price_high
つまり、クリックされた条件のGETパラメータを解除できていません。
検索条件が一つの場合は以下のようにするだけです。
PHP
1<a href="{{ url('/?order=price_low') }}">価格の安い順</a>
しかしパラメータが複数ある場合、選択済みの条件を保ったままパラメータを付与する必要があります。
求める動き
order=price_low を表示している状態で「価格の高い順」のリンク生成する場合 ↓ order=price_low (とpage)をリセットした上で、他のパラメータは引き継ぎ、 最後に order=price_high を付与
「クリックされた条件のパラメータ」と「page」のみをリセットすることができません。
コントローラ
PHP
1public function search(Request $request) 2{ 3 // 存在し得る全パラメータ 4 $params = $request->only('order', 'kind', 'used', 'keyword', 'page'); 5 6 // $remains 引き継ぐパラメータ 7 // 以下が問題 「クリックされた条件」を除外できない 8 // 除外するのは「クリックされた条件」と「page」のみ 9 $remains = $request->only('order', 'kind', 'used', 'keyword'); 10 11 // 商品を絞り込み検索 12 $goods = Good::search($params)->paginate(30); 13 14 return view('list', compact('goods', 'params', 'remains')); 15}
ビュー
価格の安い順 | 価格の高い順 | 発売日
↑「価格の安い順」の表示部分だけ以下に示しています。
PHP
1// 現在「価格の安い順」を表示している場合はリンクにしない 2@if( isset($params['order']) && $params['order'] === 'price_low') ) 3 <span>価格の安い順</span> 4 5//現在「価格の安い順」ではない場合 6@else 7 // 引き継ぐパラメータ 無 8 @if(empty($remains)) 9 <a href="{{ url('/?order=price_low') }}">価格の安い順</a> 10 // 引き継ぐパラメータ 有 11 @else 12 <a href="{{ url('/?'.http_build_query($remains).'&order=price_low') }}">価格の安い順</a> 13 @endif 14@endif
URLの生成方法として、クリックした条件を解除して新たにパラメータを付与 という方法が良くないのでしょうか?
どのような仕組みでURLを生成すべきなのでしょうか。
ご教示いただけると幸いです。どうそよろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/26 20:06