📜  Laravel-分页自定义(1)

📅  最后修改于: 2023-12-03 15:02:39.249000             🧑  作者: Mango

Laravel - 分页自定义

Laravel 提供了使用简单的分页功能。在许多情况下,开箱即用的分页就已经足够了。但是,当需要更自定义的分页时,Laravel 也为我们提供了一些灵活的选项。

基本使用

在 Laravel 中,可以使用 paginate 方法对查询结果进行分页。比如,对于 User 模型,可以使用以下代码进行分页:

use App\Models\User;

$users = User::paginate(10);

以上代码将查询 users 数据表中的所有用户数据,并分页每页显示 10 条记录。

在视图中,我们可以通过以下方式显示分页链接:

{{ $users->links() }}

以上代码将在页面中渲染分页链接。Laravel 自动根据当前页和总页数生成正确的链接。

自定义链接样式

如果要自定义分页链接样式,可以使用 links 方法的第一个参数指定链接样式。比如,以下代码将使用 pagination 类指定分页链接样式:

{{ $users->links('pagination') }}
自定义视图

如果要自定义分页链接的 HTML 代码,可以使用 links 方法的第二个参数指定视图模板。这个视图模板会接收一个 Paginator 实例作为参数。我们可以在视图模板中使用 Paginator 实例中的一些方法,如 currentPagehasMorePages 等。

比如,以下代码使用 resources/views/pagination.blade.php 文件自定义分页链接的 HTML 代码:

{{ $users->links('pagination', ['paginator' => $users]) }}

pagination.blade.php 文件中,可以按照自己的需要自定义分页链接的 HTML 代码,如下所示:

@if ($paginator->hasPages())
    <nav role="navigation" aria-label="Pagination Navigation" class="flex justify-between">
        {{-- Previous Page Link --}}
        @if ($paginator->onFirstPage())
            <a class="border border-gray-200 bg-gray-200 text-gray-500 cursor-not-allowed px-4 py-2 rounded-md mr-2" aria-disabled="true" aria-label="@lang('pagination.previous')">
                <span aria-hidden="true">@lang('pagination.previous')</span>
            </a>
        @else
            <a href="{{ $paginator->previousPageUrl() }}" class="border border-gray-200 bg-white text-gray-500 hover:bg-gray-50 px-4 py-2 rounded-md mr-2" rel="prev" aria-label="@lang('pagination.previous')">
                <span aria-hidden="true">@lang('pagination.previous')</span>
            </a>
        @endif

        {{-- Next Page Link --}}
        @if ($paginator->hasMorePages())
            <a href="{{ $paginator->nextPageUrl() }}" class="border border-gray-200 bg-white text-gray-500 hover:bg-gray-50 px-4 py-2 rounded-md ml-2" rel="next" aria-label="@lang('pagination.next')">
                <span aria-hidden="true">@lang('pagination.next')</span>
            </a>
        @else
            <a class="border border-gray-200 bg-gray-200 text-gray-500 cursor-not-allowed px-4 py-2 rounded-md ml-2" aria-disabled="true" aria-label="@lang('pagination.next')">
                <span aria-hidden="true">@lang('pagination.next')</span>
            </a>
        @endif
    </nav>
@endif
自定义查询语句

在某些情况下,我们可能需要自定义生成查询分页链接的查询语句。Laravel 提供了 withQueryStringappends 方法来帮助我们生成自定义查询语句。

比如,以下代码生成自定义查询语句:

$users = DB::table('users')
           ->where('votes', '>', 100)
           ->orderBy('name', 'desc')
           ->paginate(10);

$users->withQueryString()
            ->appends(['sort' => 'name']);

以上代码将生成类似于 http://example.com?page=2&sort=name 的查询语句。

总结

Laravel 的分页功能提供了多种自定义选项,使我们能够更好地满足项目的需求。在开发中,我们可以根据自己的需要灵活使用这些选项,从而达到最佳的开发效率和用户体验。