分页
配置
在其他框架中,分页可能非常麻烦。Laravel 使其变得轻而易举。app/config/view.php
文件中有一个单一的配置选项。pagination
选项指定用于创建分页链接的视图。默认情况下,Laravel 包含两个视图。
pagination::slider
视图将根据当前页面显示智能的“范围”链接,而 pagination::simple
视图将简单地显示“上一页”和“下一页”按钮。这两种视图与 Twitter Bootstrap 兼容。
用法
有几种方法可以对项目进行分页。最简单的方法是使用查询构建器或 Eloquent 模型上的 paginate
方法。
分页数据库结果
$users = DB::table('users')->paginate(15);
目前,使用 groupBy
语句的分页操作无法高效地由 Laravel 执行。如果您需要在分页结果集中使用 groupBy
,建议您手动查询数据库并使用 Paginator::make
。
分页 Eloquent 模型
您也可以对 Eloquent 模型进行分页:
$allUsers = User::paginate(15);
$someUsers = User::where('votes', '>', 100)->paginate(15);
传递给 paginate
方法的参数是您希望每页显示的项目数量。一旦检索到结果,您可以在视图中显示它们,并使用 links
方法创建分页链接:
<div class="container">
<?php foreach ($users as $user): ?>
<?php echo $user->name; ?>
<?php endforeach; ?>
</div>
<?php echo $users->links(); ?>
这就是创建分页系统所需的全部!请注意,我们不需要告知框架当前页面。Laravel 会自动为您确定这一点。
如果您想指定用于分页的自定义视图,可以将视图传递给 links
方法:
<?php echo $users->links('view.name'); ?>
您还可以通过以下方法访问其他分页信息:
getCurrentPage
getLastPage
getPerPage
getTotal
getFrom
getTo
count
“简单分页”
如果您只在分页视图中显示“下一页”和“上一页”链接,您可以选择使用 simplePaginate
方法来执行更高效的查询。这对于较大的数据集非常有用,当您不需要在视图中显示确切的页码时:
$someUsers = User::where('votes', '>', 100)->simplePaginate(15);
手动创建分页器
有时您可能希望手动创建分页实例,传递一个项目数组。您可以使用 Paginator::make
方法做到这一点:
$paginator = Paginator::make($items, $totalItems, $perPage);
自定义分页器 URI
您还可以通过 setBaseUrl
方法自定义分页器使用的 URI:
$users = User::paginate();
$users->setBaseUrl('custom/url');
上面的示例将创建如下 URL:http://example.com/custom/url?page=2
向分页链接附加内容
您可以使用 Paginator 上的 appends
方法向分页链接的查询字符串添加内容:
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>
这将生成如下所示的 URL:
http://example.com/something?page=2&sort=votes
如果您希望向分页器的 URL 附加“哈希片段”,可以使用 fragment
方法:
<?php echo $users->fragment('foo')->links(); ?>
此方法调用将生成如下所示的 URL:
http://example.com/something?page=2#foo
转换为 JSON
Paginator
类实现了 Illuminate\Support\Contracts\JsonableInterface
合同,并公开了 toJson
方法。您还可以通过从路由返回它来将 Paginator
实例转换为 JSON。实例的 JSON 形式将包括一些“元”信息,如 total
、current_page
、last_page
、from
和 to
。实例的数据将通过 JSON 数组中的 data
键提供。
自定义呈现器
默认的分页呈现器开箱即用与 Bootstrap 兼容;但是,您可以使用您选择的呈现器进行自定义。
扩展抽象呈现器
扩展 Illuminate\Pagination\Presenter
类并实现其抽象方法。一个 Zurb Foundation 的示例呈现器可能如下所示:
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
选项替换为新视图的名称。最后,以下代码将放置在您的自定义呈现器视图中:
<ul class="pagination">
<?php echo with(new ZurbPresenter($paginator))->render(); ?>
</ul>