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&amp;java(二)
Oct 09 PHP
mysql limit查询优化分析
Nov 12 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
一个简单的PHP验证码实现代码
May 10 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
php使用Cookie实现和用户会话的方法
Jan 21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 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
抓取YAHOO股票报价的类
2009/05/15 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
常用PHP封装分页工具类
2017/01/14 PHP
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python文件操作基础流程解析
2020/03/19 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
如何使用PHP session
2015/04/21 面试题
营业经理岗位职责
2013/11/10 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
医院科室评语
2015/01/04 职场文书