一、问题
ThinkPHP5 由于分页引擎和之前的版本完全是重构了,今天在用分页的时候突然发现,之前很简便的带条件分页竟然不好用了。
之前只要是get传递的参数,在分页之后在 ?page=x 参数的补充的时候会自动进行url的获取。
- 我之前使用的是 /id/123/key/xxx/?page=1 这样的形式的url
但是TP5无法做到。
二、解决
最坑的是文档中没有提到这一点。。。
我是使用 paginate() 函数,这个函数在 Db 或者是 Model 上都是适用的,因此对于使用 Db 还是 Model 没有什么大的影响。
关键在于 paginate() 是有三个参数:
- 第一个参数是 $listRows [int],也就是当前的页数
- 第二个参数是 $simple [boolean], 是否简洁模式或者总记录数
- 第三个参数是 $config [array],配置参数
而第三个参数中是最关键的:
/**
* 分页查询
* @param int|array $listRows 每页数量 数组表示配置参数
* @param int|bool $simple 是否简洁模式或者总记录数
* @param array $config 配置参数
* page:当前页,
* path:url路径,
* query:url额外参数,
* fragment:url锚点,
* var_page:分页变量,
* list_rows:每页数量
* type:分页类名
* @return \think\Paginator
* @throws DbException
*/
public function paginate($listRows = null, $simple = false, $config = []){}
解决办法就是利用 $config 中的 query 参数,来设置额外变量
三、代码
举个例子:
- 查询的时候,使用的条件是 status = 1; 因此我传递的参数是 xxx.html?status = 1;
- url中有一个 type 参数是额外的,不用再数据库查询中,但是url都需要这个参数 xxx.html?status=1&type=1
$status = $_GET['status']; // 为了演示 直接用$_GET
// 构造查询条件
$where [''status] = $status;
// 构造额外的条件
$pageParam=[
'status' => $status,
'type' => $type
];
// 进行分页查询
$list = $Post->where($where)->paginate(10,false,array('query'=>$pageParam));
// 获取page
$page = $postListInfo->render();
$this->assign('postListInfo',$postListInfo);
$this->assign('page', $page);
四、效果
扫描二维码关注公众号,回复:
6139075 查看本文章
可以看到,当点击分页页码的时候,会有额外的url参数出现,从而能够继续按照相关的条件逻辑进行分页。