【Laravel】ページネーションの2ページ目以降にクエリパラメータを引き継がせる方法
弊社で運用しているECサイトでは、Laravelをフレームワークとして利用しております。
今回はLaravelでの開発時に起きた問題の解消法を紹介します。
Laravelでページネーションを利用する
弊社のECサイトでは商品一覧ページでページネーションを利用しており、Laravelではコントローラに以下のように書くことでページネーションを実装します。
$products = Product::select('id', 'name', 'price', 'image');
$products_list = $products->paginate(10);
return view('product_list', compact('products_list'));
paginateメソッドの引数に、何件区切りでページを分割するか整数で指定してビューに渡し、ビュー側では、コントラーラから受け取った$products_listをforeachでループ処理し、画像や商品名などを商品ごとに表示させます。
@foreach ($products_list as $product)
// 表示処理
@endforeach
{{ $products_list->links('vendor.pagination.bootstrap-5') }}
また、linksメソッドを使うことで以下のようなページ送りを表示させることもできます。
この商品一覧ページで、特定のカテゴリ、タグに属する商品のみを表示させたい場合は、コントローラ側でクエリパラメータを受け取り、モデルに対し絞り込みをかけると良いでしょう。
$category_id = (int)$request->category_id; // カテゴリIDをクエリパラメータから取得
$conditions = [];
if ($category_id) {
$conditions[] = ['category_id', '=', $category_id];
}
$products = Product::select('id', 'name', 'price', 'image')
->where($conditions); // 条件追加
$products_list = $products->paginate(10);
return view('product_list', compact('products_list'));
これで、例えば「https://example.com/products?category_id=3」のようなパラメータ付きのURLにアクセスすると、カテゴリIDが「3」に属する商品が一覧ページに表示されます。
2ページ目以降にクエリパラメータを引き継がせる
さて、ここからが本題です。
先ほどのコントローラを実装することで、クエリパラメータを使用しての絞り込みができるようになりましたが、ページネーションを使って2ページ目などに移動すると、1ページ目でURLに指定したパラメータが消えてしまいます。
この問題を解消するためにコントローラに以下のコードを追記する必要があります。
$category_id = (int)$request->category_id;
$conditions = [];
$append_param = []; // 追加
if ($category_id) {
$conditions[] = ['category_id', '=', $category_id];
$append_param['category_id'] = $category_id; // 追加
}
$products = Product::select('id', 'name', 'price', 'image')
->where($conditions);
$products_list = $products->paginate(10);
// 2ページ目以降にパラメーターを引き継ぐ
$products_list->appends($append_param); // 追加
return view('product_list', compact('products_list'));
paginateメソッドで作成された$products_listに対し、appendsメソッドを使ってクエリパラメータから取得した値を渡しています。
こうすることで、2ページ目以降の一覧ページでも指定したカテゴリIDが引き継がれるようになります。
このカテゴリの最新記事
2024.10.17
2024.02.15
2024.08.22
2024.04.18