
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()
メソッドは不要です。