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类
Apr 09 PHP
php 中文处理函数集合
Aug 27 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
May 02 PHP
PHP array_flip() 删除重复数组元素专用函数
May 16 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
php版微信发红包接口用法示例
Sep 23 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 PHP
php中Swoole的热更新实现代码实例
Mar 04 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学习笔记之二 php入门知识
2011/01/12 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
2016/05/17 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
python使用any判断一个对象是否为空的方法
2014/11/19 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
主持词开场白
2014/03/17 职场文书
公司总经理任命书
2014/06/05 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
作风年建设汇报材料
2014/08/14 职场文书
软件测试专业推荐信
2014/09/18 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
毕业论文致谢词
2015/05/14 职场文书
被委托人身份证明
2015/08/07 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书