thinkphp(tp)中分页方法paginate的学习
学习初衷:不想用官方给的模板渲染方式,只想接受数据。
- 官方给的模板渲染:
// 查询状态为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(), // 页码按钮