目次

Laravel のページネーション

参考:https://readouble.com/laravel/7.x/ja/pagination.html

ユーザ情報を10件ずつ表示するページャを実装したい場合、以下のような記述をすれば可能。

$result = DB::table('users')->paginate(10);

ページャの表示

blade の html ファイル内に以下を記述。

{{ $users->links() }}

ビューのカスタマイズ

ページャ呼び出し時に、ビューのファイル名を指定する。

{{ $users->links('view.name') }}

ページャに表示するリンクの調整

Laravel 7 のマニュアルによれば以下の記載で、両サイドに表示するリンクの数を調整できるらしいが、私の環境では動作せず。

{{ $users->onEachSide(2)->links() }}

仕方ないので、ビューファイル内で自分で調整を。
html ファイルの呼び出し時に、side パラメータで両サイドに表示するリンク数を渡す。

{{ $arts->links('layouts/pager', ['side' => 2]) }}

layouts/pager.blade.php ファイル内の記述

@if ($paginator->hasPages())
<ul>
    @if (!$paginator->onFirstPage())
	<li class="prev"><a href="{{ $paginator->previousPageUrl() }}"></a></li>
    @endif
    @if ($paginator->currentPage() - $side > 2)
    <li class="more"><a>…</a></li>
    @endif

    @foreach ($elements as $element)
        @if (is_array($element))
            @foreach ($element as $page => $url)
                @if ($page == $paginator->currentPage())
	<li class="active"><a>{{ $page }}</a></li>
                @else
<?php
    if ($page + $side < $paginator->currentPage()
        && !($page === 1 && $paginator->currentPage() - $side === 2)
    ) {
        continue;
    } elseif ($page - $side > $paginator->currentPage()
        && !(
            $page === $paginator->lastPage()
            && $paginator->currentPage() + $side === $paginator->lastPage() - 1
        )
    ) {
        continue;
    }
?>
	<li><a href="{{ $url }}">{{ $page }}</a></li>
                @endif
            @endforeach
        @endif
    @endforeach

    @if ($paginator->currentPage() + $side < $paginator->lastPage() - 1)
    <li class="more"><a>…</a></li>
    @endif
    @if ($paginator->hasMorePages())
	<li class="next"><a href="{{ $paginator->nextPageUrl() }}"></a></li>
    @endif
</ul>
@endif

これで現在のページの左右に side で指定した数だけリンクが表示されることを確認できました。