Laravel手动分页实现方法详解

 更新时间:2016年10月09日 09:38:51   作者:hxx_yang  
这篇文章主要介绍了Laravel手动分页实现方法,结合实例形式较为详细的分析了Laravel手动分页相关源码修改与方法调用技巧,需要的朋友可以参考下

本文实例讲述了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优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

相关文章

  • php实现socket推送技术的示例

    php实现socket推送技术的示例

    下面小编就为大家分享一篇php实现socket推送技术的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 非常好用的Zend Framework分页类

    非常好用的Zend Framework分页类

    这篇文章主要介绍了非常好用的Zend Framework分页类,包含控制层、模型层、视图层及分页源码,Css部分请自由发挥,需要的朋友可以参考下
    2014-06-06
  • php+croppic.js实现剪切上传图片功能

    php+croppic.js实现剪切上传图片功能

    最近做项目遇到这样的需求,需要实现裁剪图片上传,接下来通过本文给大家分享基于php+croppic.js实现剪切上传图片功能,需要的朋友可以参考下
    2018-08-08
  • PHP编写简单的App接口

    PHP编写简单的App接口

    这篇文章主要介绍了使用PHP编写简单的App接口的一些个人的步骤以及经验总结,有需要的小伙伴可以参考下
    2016-08-08
  • Laravel中创建Zip压缩文件并提供下载

    Laravel中创建Zip压缩文件并提供下载

    在Laravel中,创建Zip压缩文件并提供下载是一个常见的需求,首先,我们需要确保服务器上安装了Zip扩展,然后使用ZipArchive类创建 Zip文件并添加需要压缩的文件和目录,最后提供直接下载或预览后下载的方式供用户下载,本文将介绍并提供详细的步骤和代码示例
    2024-03-03
  • Joomla使用Apache重写模式的方法

    Joomla使用Apache重写模式的方法

    这篇文章主要介绍了Joomla使用Apache重写模式的方法,简单讲述了Joomla开启Apache重写模式的步骤与相关技巧,需要的朋友可以参考下
    2016-05-05
  • phpstudy2018升级MySQL5.5为5.7教程(图文)

    phpstudy2018升级MySQL5.5为5.7教程(图文)

    这篇文章主要介绍了phpstudy2018升级MySQL5.5为5.7教程(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • php设计模式之单例模式用法经典示例分析

    php设计模式之单例模式用法经典示例分析

    这篇文章主要介绍了php设计模式之单例模式用法,结合具体实例形式分析了php单例模式的概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-09-09
  • 基于PHP实现用户注册登录功能

    基于PHP实现用户注册登录功能

    本课程通过使用PHP及Web前端技术实现一个网站注册登录入口页面,学习并实践PHP编程等,有兴趣的同学可以参考一下。
    2016-10-10
  • 深入PHP运行环境配置的详解

    深入PHP运行环境配置的详解

    本篇文章是对PHP运行环境配置进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论