分页实现
版本 | 新增功能 |
---|---|
5.0.5 | 分页方法返回thinkPaginator 对象(用法不变) |
5.0.1 | 支持第二个参数直接传入总记录数 |
ThinkPHP5.0
内置了分页实现 要给数据添加分页输出功能在5.0
变得非常简单 可以直接在Db
类查询的时候调用paginate
方法:
// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->paginate(10);
// 把分页数据赋值给模板变量list
$this->assign('list', $list);
// 渲染模板输出
return $this->fetch();
也可以改成模型的分页查询代码:
// 查询状态为1的用户数据 并且每页显示10条数据
$list = User::where('status',1)->paginate(10);
// 把分页数据赋值给模板变量list
$this->assign('list', $list);
// 渲染模板输出
return $this->fetch();
模板文件中分页输出代码如下:
<div>
<ul>
{volist name='list' id='user'}
<li> {$user.nickname}</li>
{/volist}
</ul>
</div>
{$list->render()}
也可以单独赋值分页输出的模板变量
// 查询状态为1的用户数据 并且每页显示10条数据
$list = User::where('status',1)->paginate(10);
// 获取分页显示
$page = $list->render();
// 模板变量赋值
$this->assign('list', $list);
$this->assign('page', $page);
// 渲染模板输出
return $this->fetch();
模板文件中分页输出代码如下:
<div>
<ul>
{volist name='list' id='user'}
<li> {$user.nickname}</li>
{/volist}
</ul>
</div>
{$page}
默认情况下 生成的分页输出是完整分页功能 带总分页数据和上下页码 分页样式只需要通过样式修改即可 完整分页默认生成的分页输出代码为:
<ul class="pagination">
<li><a href="?page=1">«</a></li>
<li><a href="?page=1">1</a></li>
<li class="active"><span>2</span></li>
<li class="disabled"><span>»</span></li>
</ul>
传入总记录数( V5.0.1
)
V5.0.1
版本开始 支持传入总记录数而不会自动进行总数计算 例如:
// 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000
$list = User::where('status',1)->paginate(10,1000);
// 获取分页显示
$page = $list->render();
// 模板变量赋值
$this->assign('list', $list);
$this->assign('page', $page);
// 渲染模板输出
return $this->fetch();
分页后数据处理 (V5.0.9
)
V5.0.9
版本开始 支持分页类后数据直接each
遍历处理 方便修改分页后的数据 而不是只能通过模型的获取器来补充字段。
$list = User::where('status',1)->paginate()->each(function($item, $key){
$item->nickname = 'think';
});
如果是Db类操作分页数据的话 each方法的闭包函数中需要使用返回值 例如:
$list = Db::name('user')->where('status',1)->paginate()->each(function($item, $key){
$item['nickname'] = 'think';
return $item;
});
简洁分页
如果你仅仅需要输出个 仅仅只有上下页的分页输出 可以使用下面的简洁分页代码:
// 查询状态为1的用户数据 并且每页显示10条数据
$list = User::where('status',1)->paginate(10,true);
// 把分页数据赋值给模板变量list
$this->assign('list', $list);
// 渲染模板输出
return $this->fetch();
简洁分页模式的输出代码为:
<ul class="pager">
<li><a href="?page=1">«</a></li>
<li class="disabled"><span>»</span></li>
</ul>
由于简洁分页模式不需要查询总数据数 因此可以提高查询性能。
分页参数
主要的分页参数如下:
参数 | 描述 |
---|---|
list_rows | 每页数量 |
page | 当前页 |
path | url路径 |
query | url额外参数 |
fragment | url锚点 |
var_page | 分页变量 |
type | 分页类名 |
分页参数的设置方式有两种 第一种是在配置文件中定义 例如:
//分页配置
'paginate' => [
'type' => 'bootstrap',
'var_page' => 'page',
],
type属性支持命名空间 例如:
//分页配置
'paginate' => [
'type' => 'orgpagebootstrap',
'var_page' => 'page',
],
也可以在调用分页方法的时候传入 例如:
$list = Db::name('user')->where('status',1)->paginate(10,true,[
'type' => 'bootstrap',
'var_page' => 'page',
]);
大王叫我来巡山1998
若出现错误Cannot use think\model\Collection as Collection because the name is already in use
就是 paginate 分页和你的模型有冲突
检查你的模型修改
大王叫我来巡山1998
$list->paginate
总计 $list->total()
满足条件的总记录数
大王叫我来巡山1998
分页方法paginate参数的问题
paginate有3个参数
第一个是一页显示的数量
第二个是简单模式或传入总计入数 默认为true
简单模式为false
第三个就是分页传入的参数了
可以直接使用助手函数
或者自己已数组的方式传入也是可以得
paginate(10,false,['query' => request()->param(), ]);
paginate($c['pagesize'],false, array("page"=>$c["page"]))