对于web应用,分页仍然非常复杂,值得庆幸的是,Laravel内置了分页,而且它默认可以hook进Eloquent和路由
数据库结果分页
分页常用于显示数据库查询结果,Eloquent和查询器从当前页面请求读取分页参数,然后将参数传给paginate()方法,传递的参数用于你想每页显示多少条数据。如示例6-15所示
Example 6-15. Paginating a query builder response
Copy // PostsController
public function index () {
return view ( 'posts.index' , [ 'posts' => DB :: table ( 'posts' ) -> paginate ( 20 ) ] ) ;
}
示例6-15指定此路由应每页返回20个帖子,并将根据URL的页面查询参数(如果有)来定义当前用户所在的结果“页面”,Eloquent模型都有paginate()方法。
当您在视图中显示结果时,集合上现在将有一个links()方法(或laravel 5.1的render()),该方法将输出分页控件
默认情况下,将使用Bootstrap库分页组件(参见示例6-16)
Example 6-16. Rendering pagination links in a template
Copy // posts/index.blade.php
<table>
@foreach ($posts as $post)
<tr><td>{{ $post->title }}</td></tr>
@endforeach
</table>
{{ $posts->links() }}
// By default, $posts->links() will output something like this:
<ul class="pagination">
<li class="page-item disabled"><span>«</span></li>
<li class="page-item active"><span>1</span></li>
<li class="page-item">
<a class="page-link" href="http://myapp.com/posts?page=2">2</a>
</li>
<li class="page-item">
<a class="page-link" href="http://myapp.com/posts?page=3">3</a>
</li>
<li class="page-item">
<a class="page-link" href="http://myapp.com/posts?page=2" rel="next">
» </a>
</li>
</ul>
Laravel 5.7及之后版本自定义分页连接数字
如果你想控制当前页左右两边的分页数量,在Laravel 5.7之后可以通过调用onEachSide()实现
Copy DB :: table ( 'posts' ) -> paginate ( 10 ) -> onEachSide ( 3 ) ;
// Outputs:
// 5 6 7 [8] 9 10 11
手动创建分页
如果你不使用Eloquent或者是查询器,或者你使用复杂的查询(例如,groupBy),你需要手动创建分页,你可以使用Illuminate\Pagination \Paginator或者Illuminate\Pagination\LengthAwarePaginator类
这两个类的区别是,Paginator只有上一页下一页,不会提供每页的跳转,LengthAwarePaginator知道结果的完整长度。
Paginator 和 LengthAwarePaginator 需要你手写分页逻辑然后传递给视图,如示例6-17
Example 6-17. Manually creating a paginator
Copy use Illuminate \ Http \ Request ;
use Illuminate \ Pagination \ Paginator ;
Route :: get ( 'people' , function ( Request $request) {
$people = [ ... ]; // huge list of people
$perPage = 15 ;
$offsetPages = $request -> input ( 'page' , 1 ) - 1 ;
// The Paginator will not slice your array for you
$people = array_slice (
$people ,
$offsetPages * $perPage ,
$perPage
) ;
return new Paginator ($people ,
$perPage
);
} ) ;
在新版中Paginator语法已经变更,如果你使用的是Laravel 5.1请翻阅文档