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