laravel 基础教程 —— 分页

分页

简介

在其他框架中,分页通常是比较痛苦的。laravel 使其变的非常简单。laravel 可以根据当前页面快速的生成智能的范围链接,并且其生成的 HTML 是兼容 Bootstrap CSS framework 的。

基础用法

对查询构建器结果进行分页

这里有几种方式来对元素进行分页。而最简单的方式就是通过使用查询构造器或者 Eloquent 查询的 paginate 方法。paginate 方法会根据当前用户所访问的当前页面来自动的设置正确的位移和显示的范围。默认的,当前页面是通过 HTTP 请求的查询字符串 ?page 来自动获取的。当然,laravel 会自动的检测到这个值,并且会自动的在生成的分页器的链接中插入合适的值。

首先,让我们来看一下在查询中调用 paginate 方法。在这个例子中,你仅需要在 paginate 方法中传递每页所需要展示的数量。让我们来设置每页展示的数量为 15 :

<?php

namespace App\Http\Controllers;

use DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
  /**
   * Show all of the users for the application.
   *
   * @return Response
   */
   public function index()
   {
     $users = DB::table('users')->paginate(15);

     return view('user.index', ['users' => $users]);
   }
}

注意:目前,laravel 中使用 groupBy 语法不能正确的进行分页操作。如果你需要使用 groupBy 来对结果进行分页,推荐你手动的执行查询和进行分页。

简单的分页

如果你只需要简单的显示“上一页”和“下一页”链接,你可以选择使用 simplePaginate 方法来执行一个有效的查询。这对于一些大型的数据库在视图中不需要显示每一页的链接时非常有效:

$user = DB::table('users')->simplePaginate(15);

对 Eloquent 结果进行分页

你也可以对 Eloquent 查询的结果进行分页。我们来对 User 模型以每页显示 15 项的方式来进行分页。其语法和使用查询构造器进行分页非常像:

$users = App\User::paginate(15);

当然,你也可以优先进行其他查询之后再进行分页操作:

$users = User::where('votes', '>', 100)->paginate(15);

你同样也可以在 Eloquent 模型分页时使用 simplePaginate 方法:

$user = User::where('votes', '>', 100)->simplePaginate(15);

手动的创建分页器

有时候你可能需要手动的创建一个分页实例,它传递项目的数组。你可以创建 Illuminate\Pagination\Paginator 或者 Illuminate\Pagination\LengthAwarePaginator 实例,这取决于你的需求。

Paginator 类不需要知道结果中项目的总数量。事实上,正是因为这样,这个类并没有提供获取最后一页的方法。LengthAwarePaginator 类似于 Paginator 接收几乎同样的参数。但是,它需要在结果中包含项目的总数目。

另一方面,Paginator 对应查询构造器和 Eloquent 中的 simplePaginate 方法。而 LengthAwarePaginator 对应 paginate 方法。

当手动的创建分页器实例时,你应该手动的对传递到分页器中的结果进行切片操作,如果你并不明白如何去进行分片,请查看 PHP 的 array_slice 方法。

在视图中显示结果

当你对查询构造器或者 Eloquent 查询使用 paginate 或者 simplePaginate 方法时,你可以获取到分页器的实例。当调用 paginate 方法时,你会获取到一个 Illuminate\Pagination\LengthAwarePaginator 实例,当调用 simplePaginate 方法时,你会获得一个 Illuminate\Pagination\Paginator 的实例。这些对象会提供多种方法来描述结果集。除了这些帮助方法,分页器本身也是一个迭代器,它可以像数组一样被循环操作。

所以,一旦你获取到了分页结果,你可以像这样在 Blade 视图中来显示和生成分页链接:

<div class="container">
  @foreach ($users as $user)
    {{ $user->name }}
  @endforeach
</div>

{{ $users->links() }}

links 方法会根据结果集来生成分页结果。对每一个链接都会自动包含 ?page 查询变量。使用 links 方法生成的 HTML 是兼容 Bootstrap CSS 框架的。

自定义分页器 URL

setPath 方法允许你对分页器生成的链接的 URI 进行定制化。比如,你希望分页器生成类似于 http://example.com/custom/url?page=N,你可以传递 custom/urlsetPath 方法:

Route::get('users', function () {
  $users = App\User::paginate(15);

  $users->setPath('custom/url');
});

追加查询字符串到分页器链接

你可以通过使用 appends 方法来添加查询字符串到分页器链接中。比如,在分页器链接中追加 &sort=votes 查询字符串。你可以像下面一样调用 appends 方法:

{{ $users->appends(['sort' => 'votes'])->links() }}

如果你需要在分页器的 URLs 中添加一个 hash 分段,你可以使用 fragment 方法。比如,在分页链接中添加 #foo

{{ $users->fragment('foo')->links() }}

其他帮助方法

你可以调用分页器实例的下面的方法来访问额外的分页器信息:

  • $results->count()
  • $results->currentPage()
  • $results->firstItem()
  • $results->hasMorePages()
  • $results->lastItem() (Not avaliable when using simplePaginate)
  • $results->nextPageUrl()
  • $results->perPage()
  • $results->previousPageUrl()
  • $results->total() (Not available when using simplePaginate)
  • $results->url($page)

转换结果为 JSON

laravel 的分页器类实现了 Illuminate\Contracts\Support\JsonableInterface 契约并且暴露了 toJson 方法,所以它可以非常简单的将分页结果转换为 JSON 格式。

你也可以在路由或者控制器动作中简单的返回分页器实例来进行 JSON 格式的响应:

Route::get('users', function () {
  return App\User::paginate(); 
});

分页器的 JSON 信息会包含许多的元数据,比如 totalcurrent_pagelast_page 等等。而实际的结果对象集会保存在 JSON 数组的 data 键中。下面是一个从路由中返回分页器实例的响应示例:

分页器 JSON 示例

{
   "total": 50,
   "per_page": 15,
   "current_page": 1,
   "last_page": 4,
   "next_page_url": "http://laravel.app?page=2",
   "prev_page_url": null,
   "from": 1,
   "to": 15,
   "data":[
        {
            // Result Object
        },
        {
            // Result Object
        }
   ]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Eloquent: 起步 简介 Laravel 的 Eloquent ORM 提供了一种漂亮简洁的关系映射的模型来...
    Dearmadman阅读 11,877评论 3 16
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,029评论 0 12
  • 欢迎大家关注我的其他 Github博客 和 CSDN ,互相交流!今天学习了Laravel中的ORM基础部分,现在...
    程序员祝融阅读 1,072评论 0 1
  • 简介 laravel 使实施认证的变得非常简单,事实上,它提供了非常全面的配置项以适应应用的业务。认证的配置文件存...
    Dearmadman阅读 6,100评论 2 13