Skip to content

分页

配置

在其他框架中,分页可能非常麻烦。Laravel 使其变得轻而易举。app/config/view.php 文件中有一个单一的配置选项。pagination 选项指定用于创建分页链接的视图。默认情况下,Laravel 包含两个视图。

pagination::slider 视图将根据当前页面显示智能的“范围”链接,而 pagination::simple 视图将简单地显示“上一页”和“下一页”按钮。这两种视图与 Twitter Bootstrap 兼容。

用法

有几种方法可以对项目进行分页。最简单的方法是使用查询构建器或 Eloquent 模型上的 paginate 方法。

分页数据库结果

php
$users = DB::table('users')->paginate(15);
lightbulb

目前,使用 groupBy 语句的分页操作无法高效地由 Laravel 执行。如果您需要在分页结果集中使用 groupBy,建议您手动查询数据库并使用 Paginator::make

分页 Eloquent 模型

您也可以对 Eloquent 模型进行分页:

php
$allUsers = User::paginate(15);

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

传递给 paginate 方法的参数是您希望每页显示的项目数量。一旦检索到结果,您可以在视图中显示它们,并使用 links 方法创建分页链接:

php
<div class="container">
	<?php foreach ($users as $user): ?>
		<?php echo $user->name; ?>
	<?php endforeach; ?>
</div>

<?php echo $users->links(); ?>

这就是创建分页系统所需的全部!请注意,我们不需要告知框架当前页面。Laravel 会自动为您确定这一点。

如果您想指定用于分页的自定义视图,可以将视图传递给 links 方法:

php
<?php echo $users->links('view.name'); ?>

您还可以通过以下方法访问其他分页信息:

  • getCurrentPage
  • getLastPage
  • getPerPage
  • getTotal
  • getFrom
  • getTo
  • count

“简单分页”

如果您只在分页视图中显示“下一页”和“上一页”链接,您可以选择使用 simplePaginate 方法来执行更高效的查询。这对于较大的数据集非常有用,当您不需要在视图中显示确切的页码时:

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

手动创建分页器

有时您可能希望手动创建分页实例,传递一个项目数组。您可以使用 Paginator::make 方法做到这一点:

php
$paginator = Paginator::make($items, $totalItems, $perPage);

自定义分页器 URI

您还可以通过 setBaseUrl 方法自定义分页器使用的 URI:

php
$users = User::paginate();

$users->setBaseUrl('custom/url');

上面的示例将创建如下 URL:http://example.com/custom/url?page=2

向分页链接附加内容

您可以使用 Paginator 上的 appends 方法向分页链接的查询字符串添加内容:

php
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>

这将生成如下所示的 URL:

php
http://example.com/something?page=2&sort=votes

如果您希望向分页器的 URL 附加“哈希片段”,可以使用 fragment 方法:

php
<?php echo $users->fragment('foo')->links(); ?>

此方法调用将生成如下所示的 URL:

php
http://example.com/something?page=2#foo

转换为 JSON

Paginator 类实现了 Illuminate\Support\Contracts\JsonableInterface 合同,并公开了 toJson 方法。您还可以通过从路由返回它来将 Paginator 实例转换为 JSON。实例的 JSON 形式将包括一些“元”信息,如 totalcurrent_pagelast_pagefromto。实例的数据将通过 JSON 数组中的 data 键提供。

自定义呈现器

默认的分页呈现器开箱即用与 Bootstrap 兼容;但是,您可以使用您选择的呈现器进行自定义。

扩展抽象呈现器

扩展 Illuminate\Pagination\Presenter 类并实现其抽象方法。一个 Zurb Foundation 的示例呈现器可能如下所示:

php
class ZurbPresenter extends Illuminate\Pagination\Presenter {

    public function getActivePageWrapper($text)
    {
        return '<li class="current"><a href="">'.$text.'</a></li>';
    }

    public function getDisabledTextWrapper($text)
    {
        return '<li class="unavailable"><a href="">'.$text.'</a></li>';
    }

    public function getPageLinkWrapper($url, $page, $rel = null)
    {
        return '<li><a href="'.$url.'">'.$page.'</a></li>';
    }

}

使用自定义呈现器

首先,在您的 app/views 目录中创建一个视图,作为您的自定义呈现器。然后,将 app/config/view.php 配置文件中的 pagination 选项替换为新视图的名称。最后,以下代码将放置在您的自定义呈现器视图中:

php
<ul class="pagination">
    <?php echo with(new ZurbPresenter($paginator))->render(); ?>
</ul>