【Laravelの使い方】ページネーションの実装方法

このページではPHPのフレームワーク「Laravel」を使ってページネーション機能を実装する方法について解説しています。

あらかじめ用意されている、ページネーション用のメソッドを使えば1から作らなくても、簡単に作ることが可能なので、やり方がわからないという人はぜひ参考にしてみてください。



ページネーションの実装方法

1. Controller側の記述

class ProductsController extends Controller
{

///////////////////////////////////
// 商品データの取得
///////////////////////////////////
public function index(Request $request){

$sort = $request->sort;
$products = Product::paginate(10);

return view('list', ['products' => $products, 'sort' => $sort]);
}

$sort = $request->sort;」はページ番号を管理するために必要なものです。おまじないみたいなものとして書く必要があるとだけ覚えておけばOKです。

次に「Product::paginate(10);」でprodutctsテーブルから10件を取り出しています。

あとはView側に$sortと$productsを返すだけでコントローラー側の処理は完了です。

もし、whereを使って条件を絞りつつページネーションを行いたい場合は、次のように書きます。

Product::where('name', $request->input('name'))->paginate(10);

2. View側の記述

View側で、画面上にページネーションを表示させるには次のように書きます。

{{ $products->links() }}

これで、画面上に「< 1 2 3 >」といった感じでページネーションが表示されるようになります。

ページネーションのスタイルを独自のものに変えるには?

Laravelで生成されるページネーションには以下のようにクラス名が割り当てられているので、このあたりをいじると自分の好きなようにデザインを調整できます。

要素 クラス名
ul
pagination
li
page-item
li(現在表示されているページ)
page-item active
a
page-link

ページネーションの番号(1・2・3)が不要な場合

番号付きページネーション ではなく、シンプルに「前へ」、「次へ」だけでよければ、paginate()メソッドの代わりに、simplePaginate()を使えば実装できます。

class ProductsController extends Controller
{

///////////////////////////////////
// 商品データの取得
///////////////////////////////////
public function index(Request $request){

$products = Product::simplePaginate(10);

return view('list', ['products' => $products);
}

番号は不要になったので、「$sort = $request->sort;」も不要です。

View側は番号付きページネーションの時と同じで、変更はありません。



検索機能と一緒に使う場合

商品一覧画面などでは、名前やカテゴリーなどで絞り込んで表示させることもありますよね。

絞り込み自体はコントローラー側のwhereに指定することで、できますがこれだけですと、画面上で「2」や「3」など他のページ番号に遷移した時に、nameやcategoryのパラメーターがクリアされ、絞り込まれていない一覧が表示されてしまいます。

その問題を解決するにはlinksメソッドappendsメソッドを使って次のようにパラメーターを追加します。

// {{ $products->links() }}
{{ $products->appends(['name' => $name, 'category' => $category])->links()  }}

おすすめのLaravelの書籍

created by Rinker
秀和システム
¥3,300 (2022/12/05 19:44:20時点 Amazon調べ-詳細)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA