ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 分页 ## 基本用法 ### 查询构造器分页 `paginate`方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。默认情况下,HTTP 请求中的`page`查询参数值被当作当前页的页码。Lavarel 自动侦测该值,并自动将其插入到分页器生成的链接中。 ``` // 传递给 paginate 方法的唯一参数是每页显示的记录条数。 <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 显示应用程序中的所有用户。 * * @return Response */ public function index() { $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); } } ``` >[success] 注意:目前,Lavarel 无法高效地执行使用了`groupBy`语句的分页操作。如果你需要使用对使用了`groupBy`的结果集分页,建议你手工查询数据库并创建分页。 ### 简单分页 ``` // 只显示『下一页』和『上一页』链接 // 在数据多且不需要在渲染视图时显示每页的页码时非常有用 $users = DB::table('users')->simplePaginate(15); ``` ### Eloquent 分页 ``` // 每页 15 条分页 $users = App\User::paginate(15); // 查询条件 $users = User::where('votes', '>', 100)->paginate(15); // 使用 simplePaginate 方法 $users = User::where('votes', '>', 100)->simplePaginate(15); ``` ### 手动创建分页 有时你可能希望手动创建分页,并传递一个数组集给它。可以通过创建`Illuminate\Pagination\Paginator`或`Illuminate\Pagination\LengthAwarePaginator`实例来实现,这有赖于你的需要。 `Paginator`类不需要知道结果集的总数;但是,这样一来,这个类就没办法获知最后一页的索引。`LengthAwarePaginator`接受和`Paginator`几乎相同的参数;不过,它会计算结果集的总数。 换句话说,`Paginator`相当于 查询构造器 或 Eloquent 的`simplePaginate`方法,而`LengthAwarePaginator`相当于`paginate`方法。 > 注意:在手动创建分页实例时,需要人为 “切割” 传递给分页实例的结果数组。如果你对此没有把握,请参考 PHP 的[array_slice](https://secure.php.net/manual/en/function.array-slice.php)函数。 ## 显示结果集调用 `paginate`方法时,会得到`Illuminate\Pagination\LengthAwarePaginator`实例。调用`simplePaginate`方法,得到的是`Illuminate\Pagination\Paginator`实例。 ``` <div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> // links 方法渲染结果集中剩余页面的链接。 // 每个链接都包含 page URL 变量。 // links 生成的 HTML 兼容 Bootstrap CSS 框架。 {{ $users->links() }} ``` ### 自定义分页器 URI ``` // 生成类似 http://example.com/custom/url?page=N 的分页链接 Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); // }); ``` ### 附加参数到分页链接 ``` // 添加参数 sort=votes {{ $users->appends(['sort' => 'votes'])->links() }} // 添加锚点 #foo {{ $users->fragment('foo')->links() }} ``` ### 调整分页链接窗口 ``` // 调整显示分页链接数量,两侧默认为三个 {{ $users->onEachSide(5)->links() }} ``` ### 将结果转换为 JSON ``` Route::get('users', function () { return App\User::paginate(); }); { "total": 50, "per_page": 15, "current_page": 1, "last_page": 4, "first_page_url": "http://laravel.app?page=1", "last_page_url": "http://laravel.app?page=4", "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "path": "http://laravel.app", "from": 1, "to": 15, "data":[ { // 结果集对象 }, { // 结果集对象 } ] } ``` ## 自定义分页视图 ``` // 指定分页视图 {{ $paginator->links('view.name') }} // 设置参数 {{ $paginator->links('view.name', ['foo' => 'bar']) }} ``` 自定义分页视图的最简方法是使用`vendor:publish`命令将它们输出到`resources/views/vendor`文件夹,编辑默认的分页视图`bootstrap-4.blade.php`文件。 ``` $ php artisan vendor:publish --tag=laravel-pagination ``` 如果想要定义不同的文件作为默认分页视图,需要在`AppServiceProvider`中使用分页器的`defaultView`和`defaultSimpleView`方法: ``` use Illuminate\Pagination\Paginator; public function boot() { Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); } ``` ## 分页器实例方法 方法 | 描述 ------- | ----------- `$results->count()` | 获取当前页数据数量。 `$results->currentPage()` | 获取当前页页码。 `$results->firstItem()` | 获取结果集中第一条数据的结果编号。 `$results->getOptions()` | 获取分页器选项。 `$results->getUrlRange($start, $end)` | 创建分页 URL 范围。 `$results->hasMorePages()` | 是否有多页。 `$results->lastItem()` | 获取结果集中最后一条数据的结果编号。 `$results->lastPage()` | 获取最后一页的页码(在 `simplePaginate` 中无效)。 `$results->nextPageUrl()` | 获取下一页的 URL 。 `$results->onFirstPage()` | 当前页是否为第一页。 `$results->perPage()` | 每页的数据条数。 `$results->previousPageUrl()` | 获取前一页的 URL。 `$results->total()` | 数据总数(在 `simplePaginate` 无效)。 `$results->url($page)` | 获取指定页的 URL。