• Laravel 手动分页实现


    Laravel 手动分页实现

    基于5.2版本

    在开发过程中有这么一种情况,你请求Java api获取信息,由于信息较多,需要分页显示。Laravel官方提供了一个简单的方式paginate($perPage),但是这种方法只适用model、查询构建器。 
    今天说下 给定一个数组如何实现 和paginate方法一样的效果。

    查看paginate方法源码

    #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的构造方法。

    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);
    }

    其实已经很明白了,假如要分页的数组为

    [
        ['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页

    use IlluminatePaginationLengthAwarePaginator;
    use IlluminatePaginationPaginator;
    use IlluminateHttpRequest;
    # 仅做演示 #
    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(‘路径’) 设置。

    页面中的分页连接也是同样的调用方式 {{ $paginator->render() }}

    好了,基本就是这样,有纰漏的地方欢迎指正!

    转:https://blog.csdn.net/hxx_yang/article/details/51753134

  • 相关阅读:
    TCP源码—连接建立
    TCP系列02—连接管理—1、三次握手与四次挥手
    TCP系列01—概述及协议头格式
    ubuntu软件管理apt与dpkg
    318. Maximum Product of Word Lengths
    317. Shortest Distance from All Buildings
    316. Remove Duplicate Letters
    315. Count of Smaller Numbers After Self
    314. Binary Tree Vertical Order Traversal
    313. Super Ugly Number
  • 原文地址:https://www.cnblogs.com/fps2tao/p/9245673.html
Copyright © 2020-2023  润新知