Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel数据表大型导出_Php_Laravel_Datatables_Laravel Excel - Fatal编程技术网

Php Laravel数据表大型导出

Php Laravel数据表大型导出,php,laravel,datatables,laravel-excel,Php,Laravel,Datatables,Laravel Excel,我已经接管了一个使用该软件包的Laravel项目。该表呈现良好,我能够添加一个CSV/Excel导出按钮,该按钮在大多数情况下工作良好 我遇到的问题是,我们的应用程序每次输出10k条记录,当我尝试将完整的数据集导出到CSV时,它会在短时间内产生500个内部服务器错误,浏览器中出现一个空白页面(空响应) 我尝试更新所有的Laravel和Laravel DataTables包,并尝试从各种论坛帖子中编写代码,试图用可能会阻塞处理的逻辑覆盖包的buildExcelFile(),但我总是得到相同的结果

我已经接管了一个使用该软件包的Laravel项目。该表呈现良好,我能够添加一个CSV/Excel导出按钮,该按钮在大多数情况下工作良好

我遇到的问题是,我们的应用程序每次输出10k条记录,当我尝试将完整的数据集导出到CSV时,它会在短时间内产生500个内部服务器错误,浏览器中出现一个空白页面(空响应)

我尝试更新所有的Laravel和Laravel DataTables包,并尝试从各种论坛帖子中编写代码,试图用可能会阻塞处理的逻辑覆盖包的
buildExcelFile()
,但我总是得到相同的结果

原始方法():

源代码使用了另一个名为的包,但我不知道如何更新逻辑,以便它在较小的块中处理并实际工作


有人能帮我找出使用Yajra Laravel DataTables包将大型结果集导出到CSV的逻辑吗?

我也有这个问题,我通过使用以下步骤进行分块来修复它: 我创建了一个名为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
{
...

如果有人使用Laravel Excel 3.0+的话,上面的解决方案将不起作用。因此,您应该使用“”重写buildExcelFile()


或者我也通过使用分块做了其他事情,但是通过创建我的trait并使用CSV来完成我的工作,这是我的工作。

查看文档和源代码,分块选项似乎仅可用于导入:(尝试放置
$this->getDataForExport()
在每个闭包上都使用它,在闭包中使用它并没有帮助,因为它只会占用内存。你可能需要考虑做一些不同的事情,就像当你有2万行时,它会继续中断一样。谢谢,@lawrencerone。我试图
var\u dump($this->getDataForExport())
即使这样也会产生同样的500服务器错误,响应为空。我甚至尝试从软件包中深入研究这些方法,看看是否可以找出需要改进的地方,但经常遇到问题。即使getDataForExport也有用于将ajaxResponseData映射到导出列的闭包,这只是一场噩梦。我原以为我在其他项目的原生DataTables服务器端处理方面取得了成功,但我想在放弃它之前,我会尝试解决Laravel问题。
<?php

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