[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。
- 入门指南
- 安装
- 部署
- 基础功能
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- URL
- Session
- 表单验证
- 错误
- 日志
- 前端开发
- Blade 模板
- 本地化
- 脚手架
- 编译资源 Mix
- 安全相关
- 用户认证
- API 认证
- 综合话题
- 命令行
- 广播
- 缓存
- 集合
- 事件
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View