分页
简介
在其它的框架中,分页是非常让人苦恼的。而在 Laravel 中却是很轻而易举的。 Laravel 可以快速生成基于当前页面链接的智能「请求范围」,并且生成 兼容 Bootstrap CSS 框架 的 HTML。
基本使用
对查询语句构造器进行分页
有几种方法可以对项目进行分页。最简单的是使用 paginate
方法。在使用 查询语句构造器 或是 Eloquent 查找 时。由 Laravel 提供的 paginate
方法能够自动判定当前页面正确的数量限制和偏移数。默认状况下,当前页数由 HTTP 请求所带的 ?page
参数来决定。当然,该值由 Laravel 自动检测,并自动插入由分页器生成的链接。
首先,让我们来看看如何在数据库查找时使用 paginate
方法。在这个例子中,传递给 paginate
唯一的参数是你想在「每页」显示的数据数。我们在此指定每页显示 15
条数据:
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示应用的所有用户。
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
目前, Laravel 的分页无法有效操作含有 groupBy
的语句。如果你需要对使用 groupBy
的结果做分页,建议你先进行数据库查找后再手动制作分页。
「简易分页」
如果在你的视图中只需要显示简单的「下一步」和「上一步」链接,你可以选择使用 simplePaginate
方法来进行更高效的查找。当你不需要在页面上显示页码时,这对于大数据来说将会非常有用:
$users = DB::table('users')->simplePaginate(15);
对 Eloquent 模型进行分页
你也可以对 Eloquent 进行分页。在这个例子中,我们将对 User
模型进行分页并且设置其每页有 15
条数据。如你所见,语法跟查询语句构造器的分页语法几乎一样:
$users = App\User::paginate(15);
当然,你也可以对 paginate
设置其它限制的查找,如 where
条件:
$users = User::where('votes', '>', 100)->paginate(15);
或者也可以在使用 Eloquent 模型 进行分页时使用 simplePaginate
方法:
$users = User::where('votes', '>', 100)->simplePaginate(15);
手动创建分页
有时候你可能会希望从项目的数组中手动创建一个分页实例。这时可以依据你的需求决定创建 Illuminate\Pagination\Paginator
或是 Illuminate\Pagination\LengthAwarePaginator
。
Paginator
类不需要知道数据的总条数;然而也正是因为这点,导致它无法提供获取最后一页的方法。LengthAwarePaginator
与 Paginator
的参数几乎相同;但是它却需要知道数据的总条数。
换句话说, Paginator
对应于查询语句构造器和 Eloquent 的 simplePaginate
方法,而 LengthAwarePaginator
则等同于 paginate
方法。
当手动创建一个分页器实例时,你应该手动「切割」传递给分页器的数组。如果你不知道如何做到这一点,请查阅 PHP 的 array_slice 函数。