一、问题

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);

四、效果

可以看到,当点击分页页码的时候,会有额外的url参数出现,从而能够继续按照相关的条件逻辑进行分页。

QQ截图20170602183946.jpg