1. 程式人生 > >laravel下資料分段匯出

laravel下資料分段匯出

最近要匯出一批日誌資料,正常的流程是從資料庫取出資料。迴圈遍歷處理資料得到結果,匯出到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');