laravel框架分页使用group后的问题
2014-11-20 10:48
901 查看
laravel框中的ORM模型确实很方便,尤其分页操作非常方便,但最近做报表时发现一个问题,当我们使用的SQL中添加了groupBy条件后再分页就会有一个问题。
不难看出,框架是取出所有的数据,然后通过array_slice来截取需要的数据段。
这种方式在数据量不大时完全没有问题,当前数据量过3000或更多时,就会报错,主要的错误是内存超出,本来框架查询出来的数据是以对象的形式返回,这样会大大的增加了内存开销。
如果这个时候还想使用框架自带的分页功能,就不能直接使用这个 paginate 函数来分页,必须另作处理:
public function getGroupPages(Builder $Builder,$perPage=null,$columns=array('*')){
$perPage = $perPage ?: $Builder->getModel()->getPerPage();
$Bindings=$Builder->getQuery()
->getConnection()
->prepareBindings($Builder->getBindings());
$BuilderPage= clone $Builder;
$BuilderPage->getQuery()->orders=null;//去掉无意义的排序
$total=\DB::Connection($Builder->getModel()->getConnectionName())->select('select count(1) as num from ('.$BuilderPage->select($columns)->toSql().') as t',$Bindings)[0]->num;//取出总记录数
$paginator = $Builder->getQuery()->getConnection()->getPaginator();
$page = $paginator->getCurrentPage($total);
$results = $Builder->forPage($page, $perPage)->get($columns)->all();
return $paginator->make($results, $total, $perPage);
}
这样可以解决数据量大报错的问题。
不难看出,框架是取出所有的数据,然后通过array_slice来截取需要的数据段。
这种方式在数据量不大时完全没有问题,当前数据量过3000或更多时,就会报错,主要的错误是内存超出,本来框架查询出来的数据是以对象的形式返回,这样会大大的增加了内存开销。
如果这个时候还想使用框架自带的分页功能,就不能直接使用这个 paginate 函数来分页,必须另作处理:
public function getGroupPages(Builder $Builder,$perPage=null,$columns=array('*')){
$perPage = $perPage ?: $Builder->getModel()->getPerPage();
$Bindings=$Builder->getQuery()
->getConnection()
->prepareBindings($Builder->getBindings());
$BuilderPage= clone $Builder;
$BuilderPage->getQuery()->orders=null;//去掉无意义的排序
$total=\DB::Connection($Builder->getModel()->getConnectionName())->select('select count(1) as num from ('.$BuilderPage->select($columns)->toSql().') as t',$Bindings)[0]->num;//取出总记录数
$paginator = $Builder->getQuery()->getConnection()->getPaginator();
$page = $paginator->getCurrentPage($total);
$results = $Builder->forPage($page, $perPage)->get($columns)->all();
return $paginator->make($results, $total, $perPage);
}
这样可以解决数据量大报错的问题。
相关文章推荐
- PHP之Laravel框架使用问题汇总与解决方式
- TP框架分页源码使用问题
- 在Laravel外使用Eloquent(二)- 分页问题
- laravel框架使用git clone时遇到的问题
- laravel框架使用webuploader token问题
- GridView使用DataBind方法绑定数据时的分页问题[转]
- 分页显示页使用GridView调整【显示隐藏】列没有即时更新的问题.docx
- 解决使用HIBERNATE对ORACLE数据库中数据进行排序分页错乱的问题
- 转:关于我使用spring mvc框架做文件上传时遇到的问题
- 使用ajax的prototype框架时返回的responseText值的问题
- 【视频】自然框架之分页控件的使用方法(一) PostBack方式的一般分页方式
- JSF中使用dataScroller和dataTable实现分页及其相关问题
- 关于在struts 框架中使用Filter过滤器解决汉字编码问题
- 【视频】自然框架之分页控件的使用方法(二) 下载、DLL说明和web.config的设置
- struts1 验证框架使用时应注意的问题
- JSP 分页框架 Pager Tag Library使用
- 解决使用框架session过期后主页面中显示登陆页面问题
- 【转载】IE中Iframe跨站引用时,框架内程序不能使用cookies问题解决
- .NET 中使用框架时Session 为空的问题!待解!
- 初识ExtJS---之使用Extjs框架引用的路径问题