最近要导出一批日志数据,正常的流程是从数据库取出数据。循环遍历处理数据得到结果,导出到excel。
貌似流程很完美,没有问题,但是数据量过大的时候,就会出现内存不够用的情况。这种情况只能把数据分段取出处理。
laravel已经给我们提供了这样的功能,下面我们来实现吧。
$num = 500; //分段数量
$publishData =[];
$publishObj = PublishLog::where('id','>',0)->orderBy('id','asc');
if($publishObj->count() > 0){
$publishObj->chunk($num, function ($publishLog) use (&$publishData) {
$logData = $publishLog->toArray();
if(count($logData) > 0){
foreach ($logData as $v) {
if(!isset($publishData[$v['company_name'].$v['product_name'].$v['create_day']])){
$publishData[$v['company_name'].$v['product_name'].$v['create_day']]['时间'] = $v['create_day'];
$publishData[$v['company_name'].$v['product_name'].$v['create_day']]['发布次数'] = 1;
}else{
$publishData[$v['company_name'].$v['product_name'].$v['create_day']]['发布次数'] += 1;
}
}
}
});
} else{
$publishData['test']['时间'] = null;
$publishData['test']['发布次数'] = null;
}
//导出
Excel::create('日志记录', function ($excel) use ($publishData) {
$excel->sheet('发布记录', function ($sheet) use ($publishData) {
$sheet->fromArray($publishData);
});
})->export('xls');