1 Вопрос: Laravel Excel 3.1 экспорт больших данных

вопрос создан в Thu, May 2, 2019 12:00 AM

Мне нужно экспортировать более 100 тыс. записей в Excel из базы данных с помощью плагина Maatwebsite Laravel Excel 3.1, проблема в том, что я получаю данные в виде массива.

$data = $this->client->getData("sc/asistencia-social/informe",$request->all());

 return (new ExcelExport($data))->store('myFile.xlsx'); //using FromQuery

Мой класс ExcelExport:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\SerializesModels;

class ExcelExport implements FromQuery
{
 use Exportable, SerializesModels;
 private $data;

public function __construct($data)
{   
   $this->data = $data;     //Inject data 
}

public function query()
{   
   return $this->data;  
}
}

На самом деле я получаю ошибку «Вызов функции-члена chunk () в массиве».  Я даже пытался превратить его в коллекцию безуспешно. Есть ли какое-либо возможное решение для этого.

    
1
1 ответ                              1                         

Вы создали класс экспорта как класс экспорта FromQuery. вместо этого создайте класс экспорта FromArray.

Обратите внимание на интерфейс инструмента и имя функции

class ExcelExport implements FromArray // this was FromQuery before
{
    use Exportable, SerializesModels;

    private $data;

    public function __construct($data)
    {   
        $this->data = $data;     //Inject data 
    }

    public function array(): array // this was query() before
    {   
        return $this->data;  
    }
}
    
2
2019-05-02 15: 12: 27Z
  1. Я тестирую его и получаю, что «Объявление приложения \Exports \ExcelExport :: array () должно быть совместимо с Maatwebsite \Excel \Concerns \FromArray :: array () : массив "
    2019-05-02 15: 09: 15Z
  2. Я думаю, что это из-за пропущенного типа возврата функции array(), Обновлен ответ
    2019-05-02 15: 12: 13Z
  3. Он все еще работает, на экспорт записей aprox 30k уходит более 4 минут, я читал фрагменты FromQuery, некоторые говорят только об импорте, но не об экспорте. это так?
    2019-05-02 15: 55: 20Z
  4. Нет, вы МОЖЕТЕ использовать FromQuery для экспорта, и это тоже лучше, чем этот подход. Но если вы хотите сделать это, вы не хотите передавать данные через конструктор. вам нужно написать запрос к базе данных в функции query(). Если в базе данных много данных, я думаю, это лучшее решение.
    2019-05-02 15: 58: 47Z
  5. Невозможно. Если вы хотите использовать подход FromQuery, вы должны предоставить SQL-запрос к этой функции query(). Затем они позаботятся о получении данных из базы данных (там, где они применяют чанки). В противном случае вы не сможете использовать подход FromQuery.
    2019-05-03 00: 41: 49Z
источник размещен Вот