博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 大将之 分页 模块
阅读量:6871 次
发布时间:2019-06-26

本文共 4093 字,大约阅读时间需要 13 分钟。

简介

分页模块的基本使用有两种:一种是基于查询构建器或Eloquent模型,调用paginate方法;另一种是手动创建分页器;

Laravel框架的分页器不仅实现了数据的分页,而且支持生成Bootstrap的分页框,如下图所示

图片描述

使用

基于查询构建器或Eloquent模型

User表获取数据,每页16条,可以这样写

$users = DB::table('user')->paginate(16);// 或$users = User::paginate(16);

这时的$userIlluminate\Pagination\LengthAwarePaginator实例;这里没有传递当前页的原因是,如果不传递,会从$request请求获取当前页;

paginate方法完整参数定义如下:

paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

其中 $perPage 代表每页显示数目, $columns 代表查询字段, $pageName 代表页码名称, $page 代表第几页。

同理,也可以获取另一种分页,简单分页

$users = DB::table('user')->simplePaginate(16);// 或$users = User::simplePaginate(16);

这时的$userIlluminate\Pagination\Paginator实例;

要想在页面呈现分页器的小方块, 只要在blade.php 中书写

{!! $users->render() !!}

手动创建

通过看看LaravelDatabase是怎么实现创建分页器,更好地学会使用手动创建;

先看看paginate方法,

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)   {                   // 获取当前页数    $page = $page ?: Paginator::resolveCurrentPage($pageName);           // 获取每页的数量    $perPage = $perPage ?: $this->model->getPerPage();                   // Collection类,存放当前页的数据记录    $results = ($total = $this->toBase()->getCountForPagination())                                      ? $this->forPage($page, $perPage)->get($columns)                        : $this->model->newCollection();                                                                                                                                         return new LengthAwarePaginator($results, $total, $perPage, $page, [         // 当前页面的 url        'path' => Paginator::resolveCurrentPath(),                                                      'pageName' => $pageName,                                                                    ]);                                                                                         }

再看看simplePaginate方法

public function simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null){            // 获取当前页数    $page = $page ?: Paginator::resolveCurrentPage($pageName);                                      // 获取每页的数量                          $perPage = $perPage ?: $this->model->getPerPage();                                                                                                                                              // 调用 Database 模块当前类的方法,获取当前页的数据;    // 下面这个语句只是设置查询条件,get 方法调用时才是真正去获取    $this->skip(($page - 1) * $perPage)->take($perPage + 1);                                                                                                                                         return new Paginator($this->get($columns), $perPage, $page, [          // 当前页面的 url        'path' => Paginator::resolveCurrentPath(),                                                      'pageName' => $pageName,                                                                    ]);                                                                                         }

看看源代码

服务提供者 ServiceProvider

boot方法

public function boot(){    // 注册包视图    $this->loadViewsFrom(__DIR__.'/resources/views', 'pagination');    // 如果程序是在命令行下运行,则将模块内的`resources/views`文件夹下的文件    // 发布一份到项目的`views/vendor/pagination`文件夹;    // publishes 方法的第二个参数是 group 组;    if ($this->app->runningInConsole()) {        $this->publishes([            __DIR__.'/resources/views' => $this->app->resourcePath('views/vendor/pagination'),        ], 'laravel-pagination');    }}

register方法

public function register(){    // 绑定 view 视图解析器    Paginator::viewFactoryResolver(function () {        return $this->app['view'];    });    // 绑定 url 路径解析器,返回当前 url    Paginator::currentPathResolver(function () {        return $this->app['request']->url();    });    // 绑定 当前页 解析器,返回当前页    Paginator::currentPageResolver(function ($pageName = 'page') {        $page = $this->app['request']->input($pageName);        if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {            return $page;        }        return 1;    });}

分页器类有两个PaginatorLengthAwarePaginator,都继承了父类AbstractPaginator;两者的主要区别主要在于render方法,也就是呈现的bootstrap风格的分页器不一样;

Paginator的分页器,只有上一页和下一页的图标

图片描述

LengthAwarePaginator的分页器

图片描述

转载地址:http://mqpfl.baihongyu.com/

你可能感兴趣的文章
字符串匹配算法
查看>>
LAMP学习路线图
查看>>
MySQL入门(四)
查看>>
详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)
查看>>
httpd-2.2 配置及用法完全攻略
查看>>
IntelliJ_编译一直报错“找不到符号”
查看>>
【Mongodb】3.X 配置身份验证
查看>>
云计算就像马拉松 京东CTO为啥这么说
查看>>
2017阿里UCAN大会,听听大咖们都讲了啥
查看>>
每日一淘完成1.3亿美元融资:元生资本与DCM领投
查看>>
「每天一道面试题」Java虚拟机为新生对象分配内存有哪两种方式?
查看>>
海信电器于芝涛:坚守画质 才是消费者首选
查看>>
甘肃庆阳黄土塬告别“土炕”“火炉” 多措治污享蓝天
查看>>
NPM实用指北
查看>>
直播竞答必读:一定要提前知道的技术坑和新玩法
查看>>
React 中集成 Markdown编辑器
查看>>
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
查看>>
由三道题引伸出来的思考
查看>>
React 开发实战(一)- Repeat 组件
查看>>
小程序云开发全套实战教程(最全)
查看>>