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;