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 相关文章推荐
wordpress之wp-settings.php
Aug 17 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
stripos函数知识点实例分享
Feb 11 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 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 文件上传功能实现代码
2009/06/24 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
javascript实现表单验证
2016/01/29 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
three.js 入门案例详解
2018/01/23 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python实现括号匹配的思路详解
2018/08/23 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
升职自荐书范文
2013/11/28 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
海上钢琴师观后感
2015/06/03 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
90条交通安全宣传标语
2019/10/12 职场文书