Laravel 分页自定义:实现灵活分页与自定义视图
                           
天天向上
发布: 2025-01-18 11:54:27

原创
821 人浏览过

在 Laravel 中,分页功能是常见的数据展示需求。Laravel 自带了简单的分页功能,可以轻松分页显示数据,但有时你可能需要根据业务需求进行自定义分页,例如修改分页链接、每页显示条数、分页样式等。本文将详细介绍如何在 Laravel 中进行分页自定义,包括如何自定义分页视图、设置每页显示的数量,以及如何实现复杂的分页逻辑。

1. 基本分页

Laravel 提供了简单的分页方法,如 paginate()。你可以在查询构造器中直接调用它:

$users = User::paginate(10);  // 每页显示 10 条记录

这样会返回一个 LengthAwarePaginator 实例,它包含了分页所需的所有信息(如总记录数、当前页、每页条数等)。

示例:在控制器中使用分页

use App\Models\User;

public function index()
{
    $users = User::paginate(10); // 每页 10 条记录
    return view('users.index', compact('users'));
}

2. 自定义每页显示条数

默认情况下,paginate() 方法的每页条数是固定的。但是,你可以根据用户的选择来动态调整每页显示的条数。例如,可以让用户选择每页显示多少条记录。

示例:用户选择分页条数

public function index(Request $request)
{
    $perPage = $request->get('per_page', 10);  // 默认为 10
    $users = User::paginate($perPage);
    return view('users.index', compact('users'));
}

在视图中,你可以提供一个选择框,让用户选择每页显示的条数:

<form method="GET" action="{{ route('users.index') }}">
    <select name="per_page" onchange="this.form.submit()">
        <option value="10"{{ request('per_page') == 10 ? ' selected' : '' }}>10</option>
        <option value="20"{{ request('per_page') == 20 ? ' selected' : '' }}>20</option>
        <option value="50"{{ request('per_page') == 50 ? ' selected' : '' }}>50</option>
    </select>
</form>

3. 自定义分页链接

Laravel 默认使用简洁的分页链接样式,但你可以自定义分页链接的外观或结构。分页视图可以通过 paginate() 方法的 links() 函数来显示。

示例:默认分页链接

{{ $users->links() }}

默认情况下,links() 方法会使用 resources/views/vendor/pagination/default.blade.php 视图文件来渲染分页链接。如果你想自定义分页的 HTML,你可以发布分页视图文件并修改它。

发布分页视图文件

运行以下命令将分页视图文件发布到你的项目中:

php artisan vendor:publish --tag=pagination

然后,你可以在 resources/views/vendor/pagination 目录下找到分页视图文件,并自定义它。

示例:自定义分页视图

你可以修改 resources/views/vendor/pagination/default.blade.php 文件,来控制分页链接的样式和结构。例如,修改链接的 HTML:

@if ($paginator->hasPages())
    <ul class="pagination">
        @if ($paginator->onFirstPage())
            <li class="disabled"><span>&laquo; Previous</span></li>
        @else
            <li><a href="{{ $paginator->previousPageUrl() }}">&laquo; Previous</a></li>
        @endif

        @foreach ($elements as $element)
            @if (is_string($element))
                <li class="disabled"><span>{{ $element }}</span></li>
            @endif

            @if (is_array($element))
                @foreach ($element as $page => $url)
                    @if ($page == $paginator->currentPage())
                        <li class="active"><span>{{ $page }}</span></li>
                    @else
                        <li><a href="{{ $url }}">{{ $page }}</a></li>
                    @endif
                @endforeach
            @endif
        @endforeach

        @if ($paginator->hasMorePages())
            <li><a href="{{ $paginator->nextPageUrl() }}">Next &raquo;</a></li>
        @else
            <li class="disabled"><span>Next &raquo;</span></li>
        @endif
    </ul>
@endif

4. 自定义分页查询条件

在复杂应用中,你可能需要根据不同的条件来定制分页查询。例如,用户筛选、排序等都可能影响分页的结果。

示例:基于筛选条件分页

假设你有一个 User 模型,并且你希望根据用户名筛选并分页显示用户:

public function index(Request $request)
{
    $query = User::query();

    // 基于查询参数进行筛选
    if ($request->has('name')) {
        $query->where('name', 'like', '%' . $request->input('name') . '%');
    }

    // 分页结果
    $users = $query->paginate(10);

    return view('users.index', compact('users'));
}

在视图中,用户可以输入一个名字进行搜索:

<form method="GET" action="{{ route('users.index') }}">
    <input type="text" name="name" value="{{ request('name') }}" placeholder="Search by name">
    <button type="submit">Search</button>
</form>

5. 其他高级自定义分页

  • 总数分页:如果你需要获取总记录数的分页信息,可以使用 count() 方法来进行分页。
  • 自定义分页的查询逻辑:你可以使用 skip()take() 方法来手动控制查询的分页逻辑,但 paginate() 方法会自动处理这些。

示例:自定义查询逻辑

public function index(Request $request)
{
    $page = $request->input('page', 1);
    $perPage = 10;
    $skip = ($page - 1) * $perPage;

    $users = User::skip($skip)->take($perPage)->get();

    return view('users.index', compact('users'));
}
发表回复 0

Your email address will not be published. Required fields are marked *