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 面向对象实现代码
Nov 11 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
Nov 10 PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 PHP
php json转换成数组形式代码分享
Nov 10 PHP
php针对cookie操作的队列操作类实例
Dec 10 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
php中的抽象方法和抽象类
Feb 14 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP实现模拟http请求的方法分析
Dec 20 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 信号管理知识整理汇总
2017/02/19 PHP
用cssText批量修改样式
2009/08/29 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
基于python编写的微博应用
2014/10/17 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
python绘制随机网络图形示例
2019/11/21 Python
python 消费 kafka 数据教程
2019/12/21 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
python中最小二乘法详细讲解
2021/02/19 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
工业设计专业推荐信
2013/10/29 职场文书
小学教师听课制度
2014/02/01 职场文书
党员公开承诺书范文
2014/03/25 职场文书
小小商店教学反思
2014/04/27 职场文书
爱耳日活动总结
2014/04/30 职场文书
工会换届选举方案
2014/05/21 职场文书
后备干部培训方案
2014/05/22 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书