Laravel手动分页实现方法详解


Posted in PHP onOctober 09, 2016

本文实例讲述了Laravel手动分页实现方法。分享给大家供大家参考,具体如下:

这里的演示实例基于Laravel的5.2版本

在开发过程中有这么一种情况,你请求Java api获取信息,由于信息较多,需要分页显示。Laravel官方提供了一个简单的方式paginate($perPage),但是这种方法只适用model、查询构建器。

今天说下 给定一个数组如何实现 和paginate方法一样的效果。

查看paginate方法源码

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

其实已经很明白了,假如要分页的数组为

[
  ['username'=>'zhangsan', 'age'=>26],
  ['username'=>'lisi', 'age'=>23],
  ['username'=>'wangwu', 'age'=>62],
  ['username'=>'zhaoliu', 'age'=>46],
  ['username'=>'wangmazi', 'age'=>25],
  ['username'=>'lanzi', 'age'=>24],
  ['username'=>'pangzi', 'age'=>21],
]

共7条数据,每页显示3条,共3页

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Http\Request;
# 仅做演示 #
function userList(Request $request) {
  $users = [
    ['username'=>'zhangsan', 'age'=>26],
    ['username'=>'lisi', 'age'=>23],
    ['username'=>'wangwu', 'age'=>62],
    ['username'=>'zhaoliu', 'age'=>46],
    ['username'=>'wangmazi', 'age'=>25],
    ['username'=>'lanzi', 'age'=>24],
    ['username'=>'pangzi', 'age'=>21]
  ];
  $perPage = 3;
  if ($request->has('page')) {
      $current_page = $request->input('page');
      $current_page = $current_page <= 0 ? 1 :$current_page;
  } else {
      $current_page = 1;
  }
  $item = array_slice($users, ($current_page-1)*$perPage, $perPage); //注释1
  $total = count($users);
  $paginator =new LengthAwarePaginator($item, $total, $perPage, $currentPage, [
      'path' => Paginator::resolveCurrentPath(), //注释2
      'pageName' => 'page',
  ]);
  $userlist = $paginator->toArray()['data'];
  return view('userlist', compact('userlist', 'paginator'));
}

上面的代码中的重点是$item,如果不做注释1处理,得出的是所有7条数据。

注释2处就是设定个要分页的url地址。也可以手动通过 $paginator ->setPath('路径') 设置。

页面中的分页连接也是同样的调用方式:

{{ $paginator->render() }}

好了,基本就是这样,有纰漏的地方欢迎指正!

看看最终效果:

Laravel手动分页实现方法详解

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
配置最新的PHP加MYSQL服务器
Oct 09 PHP
建立文件交换功能的脚本(二)
Oct 09 PHP
基于mysql的论坛(6)
Oct 09 PHP
MySQL相关说明
Jan 15 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
解析php时间戳与日期的转换
Jun 06 PHP
PHP之短标签开启设置
Jun 17 PHP
Php中使用Select 查询语句的实例
Feb 19 PHP
php 将json格式数据转换成数组的方法
Aug 21 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 PHP
Laravel5.1自定义500错误页面示例
Oct 09 #PHP
Laravel重写用户登录简单示例
Oct 08 #PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 #PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 #PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 #PHP
yii通过小物件生成view的方法
Oct 08 #PHP
php获取服务器操作系统相关信息的方法
Oct 08 #PHP
You might like
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
Python字符串处理函数简明总结
2015/04/13 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
Python使用folium excel绘制point
2019/01/03 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
三爱活动实施方案
2014/03/19 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
学校推普周活动总结
2015/05/07 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL