分页
基本用法
分页记录有几种方法,最常见的是在查询或模型上调用paginate方法。 这将返回一个特殊的分页集合,该集合添加了用于显示结果的额外方法。
分页查询构造器结果
有几种方法可以对项目进行分页。 最简单的方法是在查询生成器或[模型查询(database-model.md)上使用paginate方法。 paginate方法自动根据用户正在查看的当前页面设置适当的限制和偏移。 默认情况下,当前页面由HTTP请求上的“?page”查询字符串参数的值检测。 当然,该值会自动检测并自动插入到由分页器生成的链接中。
首先,让我们看看在查询中调用paginate方法。 在这个例子中,传递给paginate的唯一参数是你想要“每页”显示的项目数。 在这种情况下,让我们指定我们希望每页显示“15”项:
$users = Db::table('users')->paginate(15);
注意: 目前,使用
groupBy语句的分页操作无法有效执行。 如果需要使用带有分页结果集的groupBy,建议您查询数据库并手动创建分页器。
简单的分页
如果您只需要在分页视图中显示简单的“Next”和“Previous”链接,则可以选择使用simplePaginate方法来执行更有效的查询。 如果在渲染视图时不需要为每个页码显示链接,则这对大型数据集非常有用:
$users = Db::table('users')->simplePaginate(15);
分页模型结果
您还可以对数据库模型查询进行分页。 在这个例子中,我们将每页“15”项对“User”模型进行分页。 如您所见,语法与分页查询构建器结果几乎完全相同:
$users = User::paginate(15);
当然,在对查询设置其他约束之后,可以调用paginate,例如where子句:
$users = User::where('votes', '>', 100)->paginate(15);
在分页模型时,您也可以使用simplePaginate方法:
$users = User::where('votes', '>', 100)->simplePaginate(15);
您可以通过传递第二个参数手动指定页码,这里我们每页分页“15”项,指定我们在页面“2”上:
$users = User::where('votes', '>', 100)->paginate(15, 2);
手动创建分页器
有时您可能希望手动创建分页实例,并向其传递一系列项目。您可以根据需要创建Illuminate\Pagination\Paginator或Illuminate\Pagination\LengthAwarePaginator实例。
Paginator类不需要知道结果集中的项目总数,因此该类没有检索最后一页索引的方法。 LengthAwarePaginator接受与Paginator几乎相同的参数,但它确实需要计算结果集中项的总数。
换句话说,Paginator对应于查询构建器和模型上的simplePaginate方法,而LengthAwarePaginator对应于paginate方法。
手动创建paginator实例时,应手动“切片”传递给paginator的结果数组。如果您不确定如何执行此操作,请查看array_slice PHP函数。
在视图中显示结果
当您在查询构建器或模型查询上调用paginate或simplePaginate方法时,您将收到一个paginator实例。 调用paginate方法时,您将收到Illuminate\Pagination\LengthAwarePaginator的实例。 调用simplePaginate方法时,您将收到Illuminate\Pagination\Paginator的实例。 这些对象提供了几种描述结果集的方法。 除了这些帮助器方法之外,paginator实例也是迭代器,并且可以作为数组循环。
因此,一旦检索到结果,您可以使用Twig显示结果并呈现页面链接:
<div class="container">{% for user in users %}{{ user.name }}{% endfor %}</div>{{ users.render|raw }}
render方法将呈现结果集中其余页面的链接。 这些链接中的每一个都已包含正确的?page查询字符串变量。 render方法生成的HTML与Bootstrap CSS framework兼容。
注意: 从Twig模板调用
render方法时,请务必使用| raw过滤器,以便不转义HTML链接。
自定义分页器URI
setPath方法允许您在生成链接时自定义分页器使用的URI。 例如,如果您希望paginator生成类似http://example.com/custom/url?page = N的链接,则应将custom/url传递给setPath方法:
$users = User::paginate(15);$users->setPath('custom/url');
附加分页链接
您可以使用appends方法添加到分页链接的查询字符串。 例如,要将&sort=votes附加到每个分页链接,您应该对appends进行以下调用:
{{ users.appends({sort: 'votes'}).render|raw }}
如果您希望在分页器的URL中附加“哈希片段”,可以使用fragment方法。 例如,要将#foo附加到每个分页链接的末尾,请对fragment方法进行以下调用:
{{ users.fragment('foo').render|raw }}
其他辅助方法
您还可以通过以下方法在paginator实例上访问其他分页信息:
$results->count()$results->currentPage()$results->hasMorePages()$results->lastPage() (使用simplePaginate时不可用)$results->nextPageUrl()$results->perPage()$results->previousPageUrl()$results->total() (使用simplePaginate时不可用)$results->url($page)
将结果转换为JSON
paginator结果类实现了Illuminate\Contracts\Support\JsonableInterface并公开了toJson方法,因此将分页结果转换为JSON非常容易。 您也可以通过从路由或AJAX处理程序返回它来将paginator实例转换为JSON:
Route::get('users', function () {return User::paginate();});
来自分页器的JSON将包括元信息,例如total,current_page,last_page等。 实际的结果对象可以通过JSON数组中的data键获得。 以下是通过从路由返回paginator实例而创建的JSON示例:
示例Paginator JSON
{"total": 50,"per_page": 15,"current_page": 1,"last_page": 4,"next_page_url": "http://octobercms.app?page=2","prev_page_url": null,"from": 1,"to": 15,"data":[{// Result Object},{// Result Object}]}
