我需要使用Laravel从数据库中获取50万行并将它们导出到excel文件中。问题是,im导出的资源有相当多的联接,当我像这样导出它时(伪代码)。
foreach( myResources as resource ) {
convertToExcelRow(resource);
convertToAnotherExcelRow(resource->joinedTable);
}Laravel创建了50万个查询,另一个创建了大量的连接。
现在,在大多数情况下,我可以使用急切的加载,它将在一个查询中加载所有内容(要快得多),但是对于如此大的查询,laravel将触发mysql错误(而且非常慢),因为进入WHERE id IN的行it列表(几十万个it)。
是否有一种使用批次快速加载的Laravel方式?例如,将100 000个id列表分解为10个查询,每个查询有10000个id或类似的内容。
发布于 2018-05-01 14:32:04
考虑使用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倍,但由于请求的联接数量增加,加载时间可能不会增加。
https://stackoverflow.com/questions/50100603
复制相似问题