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判断图片格式的七种方法小结
Jun 03 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
PHP精确计算功能示例
Nov 29 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
php7中停止php-fpm服务的方法详解
May 09 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
Node 代理访问的实现
2019/09/19 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python回调函数用法实例详解
2015/07/02 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Python3中的json模块使用详解
2018/05/05 Python
python pygame模块编写飞机大战
2018/11/20 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python实现计算器简易版
2020/12/17 Python
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
乡镇干部先进事迹材料
2014/02/03 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers