Большой экспорт Laravel DataTables

Я взял на себя проект Laravel, в котором используется пакет Yajra DataTables. Таблица отображается нормально, и я смог добавить кнопку экспорта CSV / Excel, которая по большей части работает нормально.

Проблема, с которой я сталкиваюсь, заключается в том, что наше приложение время от времени выводит 10 тыс. Записей, и когда я пытаюсь экспортировать полный набор данных в CSV, это приводит к ошибке внутреннего сервера 500 с пустой страницей в браузере (пустой ответ) после короткое время.

Я пробовал обновлять все пакеты Laravel и Laravel DataTables и пробовал код из различных сообщений на форуме, чтобы попытаться переопределить buildExcelFile() пакета логикой, которая может блокировать обработку, но я всегда получаю один и тот же результат.

Исходный метод (исходный код):

protected function buildExcelFile()
{
    /** @var \Maatwebsite\Excel\Excel $excel */
    $excel = app('excel');

    return $excel->create($this->getFilename(), function (LaravelExcelWriter $excel) {
        $excel->sheet('exported-data', function (LaravelExcelWorksheet $sheet) {
            $sheet->fromArray($this->getDataForExport());
        });
    });
}

Источник использует другой пакет под названием laravel-excel, но я не могу понять, как обновить логика, поэтому она обрабатывается меньшими частями и действительно работает.

Может ли кто-нибудь помочь разобраться в логике экспорта больших наборов результатов в CSV с помощью пакета Yajra Laravel DataTables?


person Jeff Jenkins    schedule 20.12.2017    source источник
comment
Глядя на документы и исходный код, параметр фрагмента кажется доступным только для импорта :( Попробуйте поместить $this->getDataForExport() снаружи и передать его с использованием при каждом закрытии. Это не помогает, что он находится в закрытии, поскольку он просто собирается пережевывать память. Возможно, вам придется подумать о том, чтобы сделать это по-другому, поскольку, когда у вас есть 20 тысяч строк, они будут продолжать ломаться.   -  person Lawrence Cherone    schedule 20.12.2017
comment
Спасибо, @LawrenceCherone. Я пытался var_dump($this->getDataForExport()), и даже это привело бы к той же ошибке сервера 500 с пустым ответом. Я даже пытался углубиться в эти методы из пакета, чтобы посмотреть, смогу ли я выяснить, что нужно улучшить, но часто застревал. Даже у getDataForExport есть закрытия для сопоставления ajaxResponseData со столбцами экспорта, и это просто кошмар. Я думал, что добился успеха с собственной обработкой на стороне сервера DataTables для других проектов, но решил, что попробую решить Laravel, прежде чем отказываться от него.   -  person Jeff Jenkins    schedule 20.12.2017


Ответы (2)


У меня тоже была эта проблема, я исправил ее, выполнив следующие шаги: я создал класс с именем override, который имеет метод, который переопределяет метод buildExcelFile () по умолчанию, и расширил все мои таблицы данных этим классом. И это отлично сработало для меня. Вот код моего класса переопределения

namespace App\DataTables;
use Maatwebsite\Excel\Classes\LaravelExcelWorksheet;
use Maatwebsite\Excel\Writers\LaravelExcelWriter;
use Yajra\Datatables\Services\DataTable;
class Override extends DataTable
{
protected function buildExcelFile()
{
/** @var \Maatwebsite\Excel\Excel $excel */
$excel = app('excel');

return $excel->create($this->getFilename(), function (LaravelExcelWriter    $excel) {
    $excel->sheet('exported-data', function (LaravelExcelWorksheet $sheet) {
        $this->query()->chunk(100,function($modelInstance) use($sheet) {
        $modelAsArray = $modelInstance->toArray();
        foreach($modelAsArray as $model)
        $sheet->appendRow($model);
    });
  });
});}public function query()
{
    // this method is overwritten in my datatable class , and it's that query result that is chunked method buildExcelFile() above
 }
}

Тогда мои классы Datatable выглядят примерно так

<?php

namespace App\DataTables;
use ...
class AssignDataTable extends Override
{
...

Я надеюсь, это поможет вам.

person lidichamp    schedule 21.06.2018

Если кто-то использует Laravel Excel 3.0+, верхнее решение работать не будет. поэтому вам следует переопределить buildExcelFile (), используя "Экспорт в очередь".

Или я сделал что-то еще, используя также разбиение на части, но создав свой трейт и используя CSV для выполнения своей работы, и это пример моего.

person TheGeeky    schedule 08.01.2020