关于laravel 得手动分页问题
laravel 手动分页,应用场景,需要在分页数据中传递特殊参数,laravel自带paginate方法不满足的情况下。
初始数据如下:
$data = array(
['id'=>'1','user_id'=>2,'papaer_id'=>10],
['id'=>'2','user_id'=>2,'papaer_id'=>11],
);
转为json的格式如下:
[
{
"id": "1",
"user_id": 2,
"papaer_id": 10
},
{
"id": "2",
"user_id": 2,
"papaer_id": 11
}
]
这里一共2条数据,我们设定每页显示1个,一共2页。
我们先看下laravel自带方法,给我带来的效果。
{
"total": 2,
"per_page": 1,
"current_page": 1,
"last_page": 2,
"next_page_url": "http://127.0.0.1:8999/page?page=2",
"prev_page_url": null,
"from": 1,
"to": 1,
"data": [
{
"id": 1,
"user_id": 2,
"paper_id": 10
}
]
}
我想在其中加自定义参数,比如这个路由的URL,已达到如下效果(根据自己所需加参数):
{
“path”: "http://127.0.0.1:8999",
"total": 2,
"per_page": 1,
"current_page": 1,
"last_page": 2,
"next_page_url": "http://127.0.0.1:8999/page?page=2",
"prev_page_url": null,
"from": 1,
"to": 1,
"data": [
{
"id": 1,
"user_id": 2,
"paper_id": 10
}
]
}
首先我们看下laravel得分页方法源码:
#vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:480 public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$query = $this->toBase(); $total = $query->getCountForPagination(); $this->forPage(
$page = $page ?: Paginator::resolveCurrentPage($pageName),
$perPage = $perPage ?: $this->model->getPerPage()
); return new LengthAwarePaginator($this->get($columns), $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}
我们发现这个关键就是用了lengthAwarePaginator
LengthAwarePaginator的构造方法,如下:
public function __construct($items, $total, $perPage, $currentPage = null, array $options = [])
{
foreach ($options as $key => $value) {
$this->{$key} = $value;
} $this->total = $total;
$this->perPage = $perPage;
$this->lastPage = (int) ceil($total / $perPage);
$this->path = $this->path != '/' ? rtrim($this->path, '/') : $this->path;
$this->currentPage = $this->setCurrentPage($currentPage, $this->lastPage);
$this->items = $items instanceof Collection ? $items : Collection::make($items);
}
控制器中,分页方法调用:
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator; public function show(Request $request){
$blogs = DB::table('blog')->where('uid',$uid)->select(); // 假设查出的数据
$perPage = 1; // 每页显示数量
if ($request->has('page')) { // 请求是第几页,如果没有传page数据,则默认为1
$current_page = $request->input('page');
$current_page = $current_page <= 0 ? 1 :$current_page;
} else {
$current_page = 1;
}
$item = array_slice($real, ($current_page-1)*$perPage, $perPage); // 注释1 $total = count($blogs); // 查询总数 $paginator =new LengthAwarePaginator($item, $total, $perPage, $current_page, [
'path' => Paginator::resolveCurrentPath(), // 注释2
'pageName' => 'page',
]); return response()->json(['result'=>$paginator])
}
注释1: array_slice(array,start,length) 从start位置,去获取length参数。结果返回一条数据
注释2:就是设定个要分页的url地址。也可以手动通过 $paginator ->setPath(‘路径’) 设置。
页面中的分页连接也是同样的调用方式 {{ $paginator->render() }}。
注:返回得数据格式大概如下所示:
{
“path”: "http://127.0.0.1:8999",
"total": 2,
"per_page": 1,
"current_page": 1,
"last_page": 2,
"next_page_url": "http://127.0.0.1:8999/page?page=2",
"prev_page_url": null,
"from": 1,
"to": 1,
"data": [
{
"id": 1,
"user_id": 2,
"paper_id": 10
}
]
}
如果,这篇文章帮到了你,欢迎点击推荐。有疑问,请评论。
关于laravel 得手动分页问题的更多相关文章
- Laravel 手动分页实现
Laravel 手动分页实现 基于5.2版本 在开发过程中有这么一种情况,你请求Java api获取信息,由于信息较多,需要分页显示.Laravel官方提供了一个简单的方式paginate($perP ...
- laravel带条件查询手动分页
后台php代码: //手动分页 $users = $kaoqin; //打算输出的数组,二维 $perPage = 10; if ($request->has('page')) { $curre ...
- laravel二维数组手动分页显示
示例:数组 $user 如下 $user: array (size=) 'sort' => array (size=) => float 0.028616622341171 => f ...
- Laravel 5.2分页--怎么在一个页面实现两个以上的列表分页,互不影响?
今天就碰到这样的一个问题?想在一个页面里面放两个列表,并且两个列表都可以进行分页. 但是,laravel提供的分页方法很方便,可是两个以上就出问题了,当我点其中一个分页的链接时候,页面上其余的分页跟着 ...
- 对一个结果集(List)进行手动分页
对一个链表List,进行手动分页,核心代码就是pagin函数: import lombok.extern.slf4j.Slf4j; import org.junit.Before; import or ...
- java手动分页处理
经常我们在操作数据库的时候都会用到分页,而且很多框架也提供了分页功能,像PageHelper. 但是在有些项目中,需要将数据查询出来进行手动分页,那么原理是什么呢? 其实很简单,首先需要知道数据总量, ...
- 纯js手动分页
昨天让做个页面,后台提供所有数据,没有做好分页,需要前端js手动分页. 我参考了 http://www.cnblogs.com/jiechn/p/4095029.html 做了些许改动让分页效果更加完 ...
- Laravel手动分页的方法
use Illuminate\Pagination\LengthAwarePaginator; public function index(Request $request){ $list =[... ...
- [ Laravel 5.6 文档 ]laravel数据库操作分页(自定义分页实现和自定义分页样式)
简介 在其他框架中,分页可能是件非常痛苦的事,Laravel 让这件事变得简单.易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基 ...
随机推荐
- HTML4,HTML5,XHTML 之间有什么区别?
原始日期:2014-10-25 14:12 我来从HTML的历史谈谈他们3者的区别.在HTML的早期发展中,W3C成立之前,很多标准的制定都是在浏览器的开发者们互相讨论的情况下完成的,比如HTML 2 ...
- github用法小结
共享仓库 bare 裸仓库 生成裸仓库时必须以.git结尾. 仓库就相当于一个服务器 ### 创建远程仓库 1. 创建以.git结尾的目录mkdir repo.git 2 ...
- 如何使用VBS脚本给在直播间授权登陆
直接上代码,看不懂说明你技术不够 set WshShell=WScript.CreateObject("WScript.Shell") Dim ie Set mouse=New S ...
- tkinter模块常用参数(python3)
1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root.title('标题名') 修改框体的名字,也可在创建时使用className参数来命名:root.r ...
- Angular路由(三)
AngularJs ng-route路由详解 其实主要是$routeProvider搭配ng-view实现. ng-view的实现原理,基本就是根据路由的切换,动态编译html模板. 前提 首先必须在 ...
- 总结下Redux
Redux 和 React 没有直接关系,它瞄准的目标是应用状态管理. 核心概念是 Map/Reduce 中的 Reduce.且 Reducer 的执行是同步,产生的 State 是 Immutabl ...
- nodejs-ORM 操作数据库中间件waterline的使用
waterline和Sails.js同一团队开发,支持几乎所有的主流数据库,是nodejs下一款非常强大的orm,可以显著提升开发效率 一.waterline支持的数据库 二.waterline的配置 ...
- sleep() 和 wait() 有什么区别?
sleep()方法是使线程停止一段时间的方法.在sleep 时间间隔期满后,线程不一定立即恢复执行.这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非"醒来"的 ...
- MySQL5.7使用过程中遇到的问题
Q1.MySQL无法启动服务,启动服务时提示:"本地计算机 上的 MySQL 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止." PS.解压缩的MySQL安装过程也可 ...
- JS操作数组常用的方法
JS操作Array对象的方法 concat(arr1,arr2,...):连接数组indexOf(value):返回数组中value的第一个索引join(separator):将数组中所有的元素连接由 ...