背景:在使用laravel查询构建器之后
关于分页自己常用的两种方法
$sql -> offset($params['start'])->limit($params['length']);
通过偏移(offset)和限制(limit)来实现分页 ,
offset 表示 当前页数
limit 表示 每页条数
但是这种方法我们需要再加一个接口来获取总条数
第二种可以在分页后获取到数据的同时,也返回总条数
语法:paginate(int $perPage, array $columns, string $pageName, int|null $page)
int $perPage:每页几条
array $columns:返回的字段数组。
string $pageName:分页字段名(无特殊要求我都是命名为page)
int|null $page:第几页
paginate(3,['rb_order_id'],'page',2);
!!!数据处理:如果还需要重新封装,只获取其中的某些数据的话。
也可以通过$res->toArray()
转为数组,或者$res->toJson()
转为json串,
个人偏向转为json比较多,所以常用$res->toJson()
然后通过 $res['total'](数组) 或者 $res->total(json串) 这样的形式读取其中某些数据,再进行处理
!!补充:如果是转换为json串的话,之后可能会用到json_decode()来处理数据,这里要注意一点
通过var_dump查看数据不难发现:
一般我们在laravel中从数据库拿回来的结果集都是object对象,
而在json_decode()这个函数中,加了true和不加true后出来的数据完全是不一样的
json_decode($json):返回的是object对象
json_decode($json,true):返回的是array数组
从网上查到的方法是 用get_object_vars 把object对象转换成数组 然后在用foreach 遍历即可
$array = get_object_vars($test);
如果不转为数组
如果要用方法二的同时也返回指定字段,可以先select查出指定字段再分页
$res = $sql -> select('a.*','b.real_name','b.member_rank_id','bb.quantity')
-> paginate($params['length'],['a.order_id'],'page',$params['start'])
-> toJson();
这时候肯定有疑问,上面不是说paginate第二个字段就可以查指定字段,
的确可以,如果前面没有select的话,不过这个仅限于你要查一个字段,如果查多个会报错
在代码过程中,我发现select查的是指定字段,而paginate第二个字段相当于count('a.order_id')查条数total
也就是下面我的三行代码中,laravel其实执行了两次,一次是查select的指定字段,另一次则是查count(*)总条数
也就是paginate中第二个字段其实是在count()的查询中
如果要查多个的话 ,目前个人只发现用select再分页的方法,如果有其他欢迎补充
返回的结果如下
{
"current_page":2,//当前页数
"data":[//分页返回的结果集
{
"rb_order_id":"JH2019061512443644075"
},
{
"rb_order_id":"JH2019061514425714187"
},
{
"rb_order_id":"JH2019061515145214447"
}
],
"first_page_url":"http:\/\/localhost\/laravel57\/public\/index.php\/orderData?Eahon=1",
"from":4,
"last_page":3,//最后一页的页数
"last_page_url":"http:\/\/localhost\/laravel57\/public\/index.php\/orderData?Eahon=3",
"next_page_url":"http:\/\/localhost\/laravel57\/public\/index.php\/orderData?Eahon=3",
"path":"http:\/\/localhost\/laravel57\/public\/index.php\/orderData",
"per_page":3,//总共几页
"prev_page_url":"http:\/\/localhost\/laravel57\/public\/index.php\/orderData?Eahon=1",
"to":6,
"total":8//总数据数
}