在 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>« Previous</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}">« 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 »</a></li>
@else
<li class="disabled"><span>Next »</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'));
}