6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

laravelでのページネーション実装とカスタマイズ

Posted at

Laravelで検索結果の一覧表示画面にページネーションを実装する方法と、デザインをカスタマイズする方法の個人的な備忘録。

環境

PHP 8.1
Laravel 9

ページネーションの実装

まずはModelからデータを取得してViewにページネーションを表示するまで。

データ取得

今回はトピックの一覧を表示する画面を作成したので、Topicsモデルからデータを取得する。
1ページあたりの表示件数は10件とした。

public function getTopics(): LengthAwarePaginator
{
  return  Topic::paginate(10);
}

取得時のwhere条件や並び替えなどがあれば適宜追加する。

viewへの表示

続いて取得したデータを表示するbladeファイル。

@foreach ($topics as $key => $topic)
  <div>
    {{ $topic->title }}
  </div>
@endforeach

<!-- ページネーション用のリンクボタン -->
{{ $topics->links }}

これで取得したトピックのタイトルを一覧表示する画面にページネーションが実装できた。とても簡単。
が、これだけではデザインが大きく崩れたいた。どうやらBootstrapのデザインが適用されていなかったようで・・・。

Bootstrapデザインの適用

Bootstrapのデザインを適用させるにはAppServiceProviderに記述を追加する必要がある。

<?php

// app\Providers\AppServiceProvider.php
   
namespace App\Providers;
   
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
   
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
     
    }
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Paginator::useBootstrap(); // これを追記する。
    }
}

これでBootstrapのデザインが適用され、とりあえず見た目だけは綺麗になった。

デザインのカスタマイズ

画面デザインに合わせてページネーションのボタンのデザインも変更する必要があったので、カスタマイズしてみた。

まずは以下のコマンドを実行する。

php artisan vendor:publish --tag=laravel-pagination

すると resources/views/vendor/paginationディレクトリが作成され、この中にページネーションのbladeファイルが色々作成される。
この中に独自デザインのページネーション用bladeファイルを作成する。
今回はデフォルトで用意されているdefault.blade.phpをコピーして新たにtopics.blade.phpを作成し、このbladeファイルを色々編集してデザインを変更した。

一つ前のページへのリンク、一つ後のページへのリンクなどもここで記述されているので、見た目だけでなく細かい挙動などをカスタマイズすることもできた。

無事カスタムページネーションのbladeファイルができたら今度はこれを元のbladeファイルに反映する。

<!-- ページネーション用のボタン -->
<!-- {{ $topics->links }} -->
{{ $topics->links('vendor.pagination.topics' }}

ページネーション用のボタンを上記のように変更する。反映させるbladeファイルを単純に指定するだけなので簡単にカスタムページネーションを反映させることができた。

また、今回は各ページに「〇〇~〇〇件 / (全体数)件」を表記してほしいとのことだったが、こちらもページネーションの機能で簡単に実装できた。

<!-- 画面表示されている項目の最初の連番 -->
{{ $topics->firstItem() }}

<!-- 画面表示されている項目の最後の連番 -->
{{ $topics->lastItem() }}

<!-- 全件数 -->
{{ $topics->total() }}

これで「11~20件 / 50件」みたいな件数の表示が実現できた。

参考文献

・Laravel8でページネーション(Pagination)を実装する方法
Bootstrapの適用方法で参考になりました。
https://leben.mobi/blog/laravel8_pagination/php/

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?