Laravel Excel::store (export) большой даты

Экспортирую данные из базы через Laravel Excel export в базе более 200 000 элементов. Но максимум экспортируется 90 000 далее уже сервер не справляется.

namespace App\Exports;

use App\Http\Resources\Excel\ProductResource;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;

class ProductsExport implements FromCollection
{
    use Exportable;


    /**
     * @return \Illuminate\Support\Collection
     */
    public function collection()
    {
        set_time_limit(3000);
        
        $product = Product::with('images');
        $products = ProductResource::collection($product->limit(100000)->get());
        $data = [];
        foreach ($products as $product) {
            $productTags = [];
            foreach ($product->tags as $tag){
                $productTags[] = $tag->id;
            }
            $product->tags = implode(",", $productTags);

            $data[] = $product;
        }

        return collect($data);
    }
}

Хотел сделать через chunk но там тупо идет загрузка без остановки (люди пишут так нельзя https://stackoverflow.com/a/39033142/15331960 ) Как посоветуете разделить или может есть какой то способ другой?


Ответы (2 шт):

Автор решения: YaMus

Если я правильно понял в офф документация написано FromQuery https://docs.laravel-excel.com/3.1/exports/from-query.html

Используется для большой даты. Нужно просто убедиться что в конце нет ->get() и т.д. и т.п.. Пример:

return Invoice::query();

return Invoice::query()->whereYear('created_at', 2022);

У меня в базе 230 000 продуктов, пример сверху справился с задачей за 2 часа. При этом нагрузка была меньше на 20% чем ->get() + без сбоя операции*

  • Обычно если ->get()'ом получать оно в какой то момент может остановиться с причиной 'timed out' или без. А FromQuery:

The Query passed with the FromQuery will automatically be chunked and each chunk will be appended to the Sheet. The chunking is done to limit the amount of Eloquent object it needs to keep in memory. It greatly reduces memory usage.

https://docs.laravel-excel.com/3.1/architecture/#processing-the-sheets

Из минусов нельзя использовать limit

→ Ссылка
Автор решения: YaMus

Перешел на FastExcel. Советую. Там работает chunk при импорте и экспорте

→ Ссылка