どうもこんにちは塚本です。
Laravelのページネーション機能、本当に便利ですよね。
コントローラ側でデータを取得する際に ->paginate() を呼び出し、Viewで {{ $items->links() }} を記述するだけで、あっという間にページネーションが実装できてしまいます。
ただ、検索結果一覧など、GETパラメータが付与されたURLでこのページネーションを使うと、2ページ目に移動した際にパラメータが消えてしまう問題に遭遇したことはありませんか?
今回は、この問題を驚くほど簡単に解決する方法についてご紹介します。知った瞬間に脳汁が出るほど感動すること間違いなしです。
GETパラメータが消えてしまう問題
まずは課題の確認です。
Laravelのページネーションは、デフォルトでは ?page=2, ?page=3 のように、ページ番号の情報だけをURLに付与します。
そのため、例えば /items?keyword=apple のように、GETパラメータで検索キーワードを受け取って結果を表示するページで2ページ目に移動しようとすると、リンク先のURLが /items?page=2 となってしまい、せっかく指定した keyword=apple の情報が消えてしまいます。
これでは2ページ目以降は検索条件が外れた状態になってしまい、ユーザーを混乱させてしまいますよね。
appends() を使えば一発解決!
これを解決するのが、appends() メソッドです。
使い方は驚くほど簡単。Viewファイルの links() メソッドの前に appends() を呼び出し、引数に request()->query() を渡すだけ。
たったこれだけで、links() が生成する全てのページネーションリンクに、現在のURLに付与されているGETパラメータを自動でマージしてくれるのです。
つまり、/items?keyword=apple というURLでこのページを表示した場合、2ページ目へのリンクは自動的に /items?keyword=apple&page=2 となります。完璧ですね。
感動、そして脳汁
この appends(request()->query()) の存在を知った瞬間、文字通り脳汁が出ました。これまで「ちょっと面倒だな」と思って自前でパラメータを組み立てていた処理が、こんなにもエレガントに解決できるとは…。Laravelの細やかな配慮と開発者体験へのこだわりに、改めて感動させられました。
知っているか知らないかで、開発効率が大きく変わる好例だと思います。もし同じようなことで悩んでいた方がいれば、ぜひこの appends() メソッドを活用してみてください。
どうもこんにちは塚本です。
Laravelのページネーション機能、本当に便利ですよね。
コントローラ側でデータを取得する際に
->paginate()を呼び出し、Viewで{{ $items->links() }}を記述するだけで、あっという間にページネーションが実装できてしまいます。ただ、検索結果一覧など、GETパラメータが付与されたURLでこのページネーションを使うと、2ページ目に移動した際にパラメータが消えてしまう問題に遭遇したことはありませんか?
今回は、この問題を驚くほど簡単に解決する方法についてご紹介します。知った瞬間に脳汁が出るほど感動すること間違いなしです。
GETパラメータが消えてしまう問題
まずは課題の確認です。
Laravelのページネーションは、デフォルトでは
?page=2,?page=3のように、ページ番号の情報だけをURLに付与します。そのため、例えば
/items?keyword=appleのように、GETパラメータで検索キーワードを受け取って結果を表示するページで2ページ目に移動しようとすると、リンク先のURLが/items?page=2となってしまい、せっかく指定したkeyword=appleの情報が消えてしまいます。これでは2ページ目以降は検索条件が外れた状態になってしまい、ユーザーを混乱させてしまいますよね。
appends() を使えば一発解決!
これを解決するのが、
appends()メソッドです。使い方は驚くほど簡単。Viewファイルの
links()メソッドの前にappends()を呼び出し、引数にrequest()->query()を渡すだけ。// Controller // (例)キーワードで絞り込んでページネーション $keyword = request('keyword'); $items = Item::where('name', 'like', '%' . $keyword . '%')->paginate(15); // View // GETパラメータを引き継いでページネーションリンクを生成 {{ $items->appends(request()->query())->links() }}たったこれだけで、
links()が生成する全てのページネーションリンクに、現在のURLに付与されているGETパラメータを自動でマージしてくれるのです。つまり、
/items?keyword=appleというURLでこのページを表示した場合、2ページ目へのリンクは自動的に/items?keyword=apple&page=2となります。完璧ですね。感動、そして脳汁
この
appends(request()->query())の存在を知った瞬間、文字通り脳汁が出ました。これまで「ちょっと面倒だな」と思って自前でパラメータを組み立てていた処理が、こんなにもエレガントに解決できるとは…。Laravelの細やかな配慮と開発者体験へのこだわりに、改めて感動させられました。知っているか知らないかで、開発効率が大きく変わる好例だと思います。もし同じようなことで悩んでいた方がいれば、ぜひこの
appends()メソッドを活用してみてください。