Laravel ExcelでCSVデータの書き出し時にメモリ上限到達のエラー

Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes)

一気に書き出そうとすると起こりがちなので、分割して書く処理に書き換える。

FromCollectionじゃなくてFromQueryを使おう。

//プロジェクトディレクトリ/app/Exports/HogeExport.php
namespace App\Exports;
use App\Models\Hoge;
use Illuminate\Support\Facades\Schema;
+ use Maatwebsite\Excel\Concerns\FromQuery;
- use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

- class HogeExport implements FromCollection, WithHeadings, WithMapping
+ class HogeExport implements FromQuery, WithHeadings, WithMapping
{
    //元々の処理

-    public function collection()
+    public function query()
    {
        //元々の処理

-        return ($hogeQuery->orderBy('created_at', 'desc')->get());
+        return $hogeQuery->orderBy('created_at', 'desc');
    }

    // ... その他のコードは変わらず ...
}

+の行を追記、-の行を消してね。

  • FromCollection: このインターフェースを使用すると、データベースからのすべてのデータを一度に取得してメモリにロードします。従って、collection()メソッドの中でget()を使ってレコードをすべて取得しています。大量のデータがある場合、これは非効率的です。すべてのデータをメモリに一度にロードすることになり、メモリ使用量が増加します。
  • FromQuery: このインターフェースを使用すると、laravel-excelはクエリを直接使用して、必要なデータだけを少しずつ取得します(チャンキングまたはページングとして知られています)。このアプローチでは、一度にすべてのデータをメモリにロードすることなく、データを効率的に処理できます。そのため、query()メソッドの中ではクエリビルダインスタンスを返すだけで、get()メソッドは不要です。
無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事