タイガーラック クリエイティブブログ
2024
October
17

【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が引き継がれるようになります。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.