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 相关文章推荐
我的论坛源代码(一)
Oct 09 PHP
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
php使用fullcalendar日历插件详解
Mar 06 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
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
2种简单的js倒计时方式
2017/10/20 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
python 输出上个月的月末日期实例
2018/04/11 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
python 装饰器的使用示例
2020/10/10 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
简历中个人自我评价范文
2013/12/26 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
运动会开幕式解说词
2014/02/05 职场文书
实践单位评语
2014/04/26 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
护林员个人总结
2015/03/04 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
聊聊redis-dump工具安装问题
2022/01/18 Redis