本文实例讲述了Laravel手动分页实现方法。分享给大家供大家参考,具体如下:
这里的演示实例基于Laravel的5.2版本
在开发过程中有这么一种情况,你请求Java api获取信息,由于信息较多,需要分页显示。Laravel官方提供了一个简单的方式paginate($perPage),但是这种方法只适用model、查询构建器。
今天说下 给定一个数组如何实现 和paginate方法一样的效果。
查看paginate方法源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:480
public function paginate( $perPage = null, $columns = [ '*' ], $pageName = 'page' , $page = null)
{
$query = $this ->toBase();
$total = $query ->getCountForPagination();
$this ->forPage(
$page = $page ?: Paginator::resolveCurrentPage( $pageName ),
$perPage = $perPage ?: $this ->model->getPerPage()
);
return new LengthAwarePaginator( $this ->get( $columns ), $total , $perPage , $page , [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName ,
]);
}
|
从上面就可以看出,分页的关键就在于LengthAwarePaginator。
LengthAwarePaginator的构造方法。
1
2
3
4
5
6
7
8
9
10
11
12
|
public function __construct( $items , $total , $perPage , $currentPage = null, array $options = [])
{
foreach ( $options as $key => $value ) {
$this ->{ $key } = $value ;
}
$this ->total = $total ;
$this ->perPage = $perPage ;
$this ->lastPage = (int) ceil ( $total / $perPage );
$this ->path = $this ->path != '/' ? rtrim( $this ->path, '/' ) : $this ->path;
$this ->currentPage = $this ->setCurrentPage( $currentPage , $this ->lastPage);
$this ->items = $items instanceof Collection ? $items : Collection::make( $items );
}
|
其实已经很明白了,假如要分页的数组为
1
2
3
4
5
6
7
8
9
|
[
[ 'username' => 'zhangsan' , 'age' =>26],
[ 'username' => 'lisi' , 'age' =>23],
[ 'username' => 'wangwu' , 'age' =>62],
[ 'username' => 'zhaoliu' , 'age' =>46],
[ 'username' => 'wangmazi' , 'age' =>25],
[ 'username' => 'lanzi' , 'age' =>24],
[ 'username' => 'pangzi' , 'age' =>21],
]
|
共7条数据,每页显示3条,共3页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Http\Request;
# 仅做演示 #
function userList(Request $request ) {
$users = [
[ 'username' => 'zhangsan' , 'age' =>26],
[ 'username' => 'lisi' , 'age' =>23],
[ 'username' => 'wangwu' , 'age' =>62],
[ 'username' => 'zhaoliu' , 'age' =>46],
[ 'username' => 'wangmazi' , 'age' =>25],
[ 'username' => 'lanzi' , 'age' =>24],
[ 'username' => 'pangzi' , 'age' =>21]
];
$perPage = 3;
if ( $request ->has( 'page' )) {
$current_page = $request ->input( 'page' );
$current_page = $current_page <= 0 ? 1 : $current_page ;
} else {
$current_page = 1;
}
$item = array_slice ( $users , ( $current_page -1)* $perPage , $perPage ); //注释1
$total = count ( $users );
$paginator = new LengthAwarePaginator( $item , $total , $perPage , $currentPage , [
'path' => Paginator::resolveCurrentPath(), //注释2
'pageName' => 'page' ,
]);
$userlist = $paginator ->toArray()[ 'data' ];
return view( 'userlist' , compact( 'userlist' , 'paginator' ));
}
|
上面的代码中的重点是$item,如果不做注释1处理,得出的是所有7条数据。
注释2处就是设定个要分页的url地址。也可以手动通过 $paginator ->setPath('路径') 设置。
页面中的分页连接也是同样的调用方式:
1
|
{{ $paginator ->render() }}
|
好了,基本就是这样,有纰漏的地方欢迎指正!
看看最终效果:
希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。