💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 分页 ``` //$students=Student::get(); $students=Student::paginate(2); //每次取2条 return view('imocc.stu',[ 'students'=>$students ]); ``` Student是模型类,每页取2条 还有个就是按照最后的来取 ~~~ Route::get('/lessons', function() { //要创建Lesson模型的 // $lessons=\App\Lesson::all(); $lessons=\App\Lesson::latest()->paginate(15);//表示按照最新数据来分,分页池每页显示15 return view('lessons.index',compact('lessons')); }); ~~~ 页码在视图中这样写就行了 ~~~ <div> {{$students->render()}} </div> ~~~ # 还有种分页 ~~~ //rq是自己定义的函数,获取请求的信息的 //有没有自己定义的函数,获取请求的信息的 $limit=rq('limit')?:15; //要跳过多少,没有就默认在第一页,后面要跟减一,否则一开始就跳过15了 $skip((rq('page')?:1)-1)*limit; $r=$this->orderBy('created_at') ->limit($limit) ->skip($skip) ->get(['id','title','user_id']) ->keyBy('id'); //这行意思就是结果加上对应的下标,下标就是按照id来的 ~~~ 加选中样式 ~~~ <a href="{{url('stu')}}" class="{{Request::getPathInfo()=='/stu'?'active':''}}">学生列表</a> ~~~ # 数组分页 ~~~ $list = [];//你查询出来的结果 $page = Request::get('page', 1); // 获取页码 $perPage = 15;//每页的条数 $offset = ($page * $perPage) - $perPage;//计算每页分页的初始位置 //最后的[]可以不要 $list = new LengthAwarePaginator(array_slice($list,$offset,$perPage,true),count($list),$perPage, $page,['path' => Request::url(), 'query' => Request::query()]); ~~~ 实际上这样就已经实现了数组分页,有兴趣的同学可以点进去这个类看看这个类的构造方法。其实就会明白我传的这些参数的意思了,其实它就是相当于每次页面访问控制器的时候,得到页数,然后根据每页的条数计算出这时候页面上要显示的内容,其实就是每次通过array_slice()来取每个页面的值而已 # 详解原理 ## 简介 分页模块的基本使用有两种:一种是基于查询构建器或Eloquent模型,调用paginate方法;另一种是手动创建分页器; Laravel框架的分页器不仅实现了数据的分页,而且支持生成Bootstrap的分页框 ## 使用 ### 基于查询构建器或Eloquent模型 从User表获取数据,每页16条,可以这样写 ~~~ $users = DB::table('user')->paginate(16); // 或 $users = User::paginate(16); ~~~ 这时的$user是Illuminate\Pagination\LengthAwarePaginator实例;这里没有传递当前页的原因是,如果不传递,会从$request请求获取当前页; paginate方法完整参数定义如下: ~~~ paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) ~~~ 其中 $perPage 代表每页显示数目, $columns 代表查询字段, $pageName 代表页码名称, $page 代表第几页。 同理,也可以获取另一种分页,简单分页 ~~~ $users = DB::table('user')->simplePaginate(16); // 或 $users = User::simplePaginate(16); ~~~ 这时的$user是Illuminate\Pagination\Paginator实例; 要想在页面呈现分页器的小方块, 只要在blade.php 中书写 ~~~ {!! $users->render() !!} ~~~ ### 手动创建 通过看看Laravel的Database是怎么实现创建分页器,更好地学会使用手动创建; 先看看paginate方法, ~~~ public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) { // 获取当前页数 $page = $page ?: Paginator::resolveCurrentPage($pageName); // 获取每页的数量 $perPage = $perPage ?: $this->model->getPerPage(); // Collection类,存放当前页的数据记录 $results = ($total = $this->toBase()->getCountForPagination()) ? $this->forPage($page, $perPage)->get($columns) : $this->model->newCollection(); return new LengthAwarePaginator($results, $total, $perPage, $page, [ // 当前页面的 url 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); } ~~~ 再看看simplePaginate方法 ~~~ public function simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) { // 获取当前页数 $page = $page ?: Paginator::resolveCurrentPage($pageName); // 获取每页的数量 $perPage = $perPage ?: $this->model->getPerPage(); // 调用 Database 模块当前类的方法,获取当前页的数据; // 下面这个语句只是设置查询条件,get 方法调用时才是真正去获取 $this->skip(($page - 1) * $perPage)->take($perPage + 1); return new Paginator($this->get($columns), $perPage, $page, [ // 当前页面的 url 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); } ~~~ ## 看看源代码 服务提供者 ServiceProvider boot方法 ~~~ public function boot() { // 注册包视图 $this->loadViewsFrom(__DIR__.'/resources/views', 'pagination'); // 如果程序是在命令行下运行,则将模块内的`resources/views`文件夹下的文件 // 发布一份到项目的`views/vendor/pagination`文件夹; // publishes 方法的第二个参数是 group 组; if ($this->app->runningInConsole()) { $this->publishes([ __DIR__.'/resources/views' => $this->app->resourcePath('views/vendor/pagination'), ], 'laravel-pagination'); } } ~~~ register方法 ~~~ public function register() { // 绑定 view 视图解析器 Paginator::viewFactoryResolver(function () { return $this->app['view']; }); // 绑定 url 路径解析器,返回当前 url Paginator::currentPathResolver(function () { return $this->app['request']->url(); }); // 绑定 当前页 解析器,返回当前页 Paginator::currentPageResolver(function ($pageName = 'page') { $page = $this->app['request']->input($pageName); if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) { return $page; } return 1; }); } ~~~ 分页器类有两个Paginator和LengthAwarePaginator,都继承了父类AbstractPaginator;两者的主要区别主要在于render方法,也就是呈现的bootstrap风格的分页器不一样; Paginator的分页器,只有上一页和下一页的图标 ![](https://box.kancloud.cn/4d6148d3fe108bbde177e6c77d201988_584x342.jpg)