laravel>分批加载

23c0lvtd  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(400)

我需要使用laravel从数据库中获取50万行,并将它们导出到excel文件中。问题是,im导出的资源有很多连接,当我这样导出它时(伪代码)

foreach( myResources as resource ) {
   convertToExcelRow(resource);
   convertToAnotherExcelRow(resource->joinedTable);
 }

laravel创建了50万个查询+另一个这么多的查询来进行连接。
现在,对于大多数情况,我可以使用eager loading,它将在一个查询中加载所有内容(要快得多),但是对于如此大的查询,laravel将触发mysql错误(加上它非常慢),因为 WHERE id IN (数十万个ID)
有没有一种方法可以使用批处理快速加载?e、 g将100000个id列表分解为10个查询,每个查询有10000个id或类似的内容。

z9ju0rcb

z9ju0rcb1#

考虑使用 chunk 将任务分解为可管理部分的方法,如:

Resource::with(['relationship1','relationship2'])->chunk(500, function($resources) {
    $resources->each(function($resource) {
        $this->convertToExcelRow($resource);
        $this->convertToAnotherExcelRow($resource->joinedTable);
    });
});

注:

玩转区块大小(500只是一个例子)。在这种情况下,表中每500行应该有2个查询。如果选择5000,查询可能会减少10倍,但由于请求的联接数量增加,加载时间可能不会提高。

相关问题