どうもこんにちは塚本です。
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()
メソッドを活用してみてください。