thinkphp(tp)中paginate方法的学习

本文介绍了在ThinkPHP6.0中如何使用paginate方法获取和处理分页数据,详细解析了Paginator和Bootstrap类的源码,强调了toArray()方法在获取分页数据中的关键作用。通过实例展示了在不使用模板渲染时,如何仅获取"data"等重要参数以配合前端如layui的分页组件。
摘要由CSDN通过智能技术生成


学习初衷:不想用官方给的模板渲染方式,只想接受数据。

  • 官方给的模板渲染:
// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->paginate(10);

// 渲染模板输出
return view('index', ['list' => $list]);

// 模板文件中分页输出代码如下:
<div>
<ul>
{
   volist name='list' id='user'}
    <li> {
   $user.nickname}</li>
{
   /volist}
</ul>
</div>
{
   $list|raw}
  • 而我只单纯想要返回的数据
// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->paginate(10);

// 只输出数据
return $list;
  • $list return 后的格式为
// 这为官方返回的格式
{
   
	"total": 2,
	"per_page": 10,
	"current_page": 1,
	"last_page": 1,
	"data": [
		{
   
		"id": 1,
		"file_id": 1,
		"acc_set": "A"
		},
		{
   
		"id": 2,
		"file_id": 1,
		"acc_set": "A"
		}
]
}

那么问题来了:怎么获取上图中像"total"、"data"这样的值
  先说结论:

// 取"total"值
$list -> toArray()['total']; // 返回2
// 取"data"值
$list -> toArray()['data']; // 返回aray数组

  如果你急着想知道怎么获取数据,读到这就可以结束了。
  如果你想知道我解决这个问题的思路,请继续往下看。

paginate

获得所有数据的思考流程

刚拿到数据的处理方式

{
   
	"total": 2,
	"per_page": 10,
	"current_page": 1,
	"last_page": 1,
	"data": [
		{
   
		"id": 1,
		"file_id": 1,
		"acc_set": "A"
		},
		{
   
		"id": 2,
		"file_id": 1,
		"acc_set": "A"
		}
]
}

  我想当然认为是数组,就用下面方式

// 取"total"值
return $list ['total'];  

  结果控制台显示 :


  说明这不是数组类型。我又想是不是json格式的,就想转为数组:

// 将json数据转为数组,第二个参数改为‘false’,则转为对象
$list = json_decode($list, true);
return $list;

  结果和上图一样,还是没有响应数据。

var_dump()函数查看数据类型

  至此,我只能通过var_dump()函数来看看你是神马?

// var_dump()函数可以查看数据类型
return var_dump($list);

  结果是这个玩意:

object(think\paginator\driver\Bootstrap)#91 (8) {
   
  ["simple":protected]=>
  bool(false)
  ["items":protected]=>
  object(think\Collection)#83 (1) {
   
    ["items":protected]=>
    array(2) {
   
      [0]=>
      array(3) {
   
        ["id"]=>
        int(1)
        ["file_id"]=>
        int(1)
        ["acc_set"]=>
        string(1) "A"
      }
      [1]=>
      array(3) {
   
        ["id"]=>
        int(2)
        ["file_id"]=>
        int(1)
        ["acc_set"]=>
        string(1) "A"
      }
    }
  }
  ["currentPage":protected]=>
  int(1)
  ["lastPage":protected]=>
  int(1)
  ["total":protected]=>
  int(2)
  ["listRows":protected]=>
  int(10)
  ["hasMore":protected]=>
  bool(false)
  ["options":protected]=>
  array(6) {
   
    ["var_page"]=>
    string(4) "page"
    ["path"]=>
    string(34) "/index.php/admin/vouch_info/search"
    ["query"]=>
    array(0) {
   
    }
    ["fragment"]=>
    string(0) ""
    ["list_rows"]=>
    string(2) "10"
    ["page"]=>
    int(1)
  }
}

  可以看出是一个think\paginator\driver\Bootstrap对象,由于每个属性都是protected,所以也没法直接调用($list -> total)。

  那接下来就是找源码。主要涉及两个源码:Bootstrap和Paginator(Bootstrap extends Paginator),这两个源码在文章最后。
  我找源码的方式:
    在任意控制器里使用下图方式引入,然后crtl+鼠标左键

use think\paginator\driver\Bootstrap;

Bootstrap部分源码

  这两个源码也不难,简单来说Paginator类就是对分页所有数据进行处理,而Bootstrap类是将Paginator类处理好的数据渲染到模板上。

  Bootstrap类所有方法都是生成什么什么按钮,只有一个render()方法是最核心的,他就是将按钮渲染到页面上。

/**
     * 渲染分页html
     * @return mixed
     */
    public function render()
    {
   
        if ($this->hasPages()) {
   
            if ($this->simple) {
   
                return sprintf(
                    '<ul class="pager">%s %s</ul>',
                    $this->getPreviousButton(), // 上一页按钮
                    $this->getNextButton()		// 下一页按钮
                );
            } else {
   
                return sprintf(
                    '<ul class="pagination">%s %s %s</ul>',
                    $this->getPreviousButton(),	// 上一页按钮
                    $this->getLinks(),			// 页码按钮
                    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值