Laravel 实现适用于 API 的分页查询
Laravel
API
Laravel自带分页查询方法里有一些多余的数据,并不完美适用于我们用来做API的查询。本文旨在通过重写 paginate 解决分页查询针对API接口的的灵活性和适用性。
新建BaseModel.php文件,代码如下:
<?php namespace App\Http\Model; use Illuminate\Database\Eloquent\Model; use Illuminate\Pagination\Paginator; class BaseModel extends Model{ public $timestamps = false; //重写分页方法,使其更加匹配API的规范 //考虑到性能问题,通常$columns我们不以*号为值。可传入需要查询的字段替代。这里只做演示。无此要求 public function paginate($perPage = null, $columns = ['*'], $page = null, $pageName = 'page'){ $page = $page ?: Paginator::resolveCurrentPage($pageName); $perPage = $perPage ?: $this->model->getPerPage(); $results = ($total = $this->toBase()->getCountForPagination()) ? $this->forPage($page, $perPage)->get($columns) : $this->model->newCollection(); $pages = ceil($total / $perPage); $result = ['total'=>$total,'current_page'=>$page,'page_size'=>$perPage,'pages'=>$pages,'list'=>$results]; return $result; } }
然后在业务模型继承此类即可,范例如下:
<?php namespace App\Http\Model; class MsgBoard extends BaseModel{ protected $table = 'msg_board'; public function getMsgPageList($page,$pageSize){ return $this->paginate($pageSize, ['*'], $page, 'page'); } }
然后在控制器当中调用即可。范例如下:
$page = $request->input('page',1); $pageSize = $request->input('pageSize',12); $msgList = $mMsgBoard->getMsgPageList($page,$pageSize);
THE END;
Jason
左手代码右手烟!