質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

2767閲覧

[Laravel]GETによる検索条件絞り込みのURL生成方法がわかりません

akomit

総合スコア18

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/06/25 17:19

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を生成すべきなのでしょうか。

ご教示いただけると幸いです。どうそよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ルート定義で、urlの/にtopなどの名前をつけて、routeヘルパーを使うと、第二引数でルートパラメータでない場合は、クエリストリングになります。

route("top",["order"=>"price_low"])

Laravel route url with query string

記法がすっきりするので、これで必要な配列変数を整理すれば、問題解決しやすいかと思います。

投稿2019/06/26 05:53

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akomit

2019/06/26 20:06

url() より route() を使用した方がスマートですね。 route() の第二引数配列は、ルートの {} で指定したパラメータ以外であれば、GETパラメータになるのですね。 ありがとうございました。
guest

0

ベストアンサー

(例)の状態から「価格の高い順」をクリックすると以下のようにorderが重複してしまう。
?order=price_low&kind=3&used=true&order=price_high

http_build_queryに渡す引数の配列自体に正しいorderの値を入れた方が簡潔(後に文字列で連結するよりも)だと思うので、マージした配列を渡してはどうですか?

php

1<a href="{{ url('/?'.http_build_query(array_merge($remains, ['order' => 'price_low']))) }}">価格の安い順</a>

これであれば、$remainsの中身自体は変えずに、orderを上書き(なければ追加)できます。

array_mergeは、配列のキーが「数字」の時と「文字列」の時で異なる挙動をしますので、マニュアルをよく確認してから使ってくださいね。。!

投稿2019/06/26 02:50

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akomit

2019/06/26 20:02

実現できました!ありがとうございます。 array_merge は同じキー文字列がある場合、後に指定された値で上書きされる仕様なのでピッタリですね! $remains は $request->only() で存在しうる全てのパラメータを指定することで、リクエストされたパラメータのみを取得することができますね。 そして array_merge すれば、クリックされたパラメータが無ければ普通に追加し、有れば上書きされますね。 ありがとうございました。
guest

0

http_build_query($remains)

ここで重複しているだけなので、パラメーター自体存在して困るものでもないなら
普通に?order=xxx&kind=xxx&used=xxx&keyword=xxxと書いてxxxの部分にそれぞれ変数を当て込むか、直接price_lowなどを書く

投稿2019/06/25 18:17

hentaiman

総合スコア6415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akomit

2019/06/26 19:54

確かに存在しうる全てのパラメータを用意して、無いものは空文字を当てれば問題なさそうですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問