我需要使用 Laravel 从数据库中获取 50 万行并将它们导出到 excel 文件中。 问题是,我正在导出的资源有很多连接,当我像这样导出它时(伪代码)
foreach( myResources as resource ) {
convertToExcelRow(resource);
convertToAnotherExcelRow(resource->joinedTable);
}
Laravel 创建了 50 万个查询 + 另一个用于进行连接的查询。
现在,对于大多数情况,我可以使用预先加载,这将在一个查询中加载所有内容(快得多)但是对于如此大的查询,laravel 将触发 mysql 错误(而且它非常慢)因为行列表进入 WHERE id IN
的 ID(数十万个 ID)
Laravel 是否有使用批处理进行预加载的方法? 例如,将 100 000 个 id 列表分解为 10 个查询,每个 10 000 个 id 或类似的东西。
最佳答案
考虑使用 chunk
方法将任务分解为可管理的部分,如下所示:
Resource::with(['relationship1','relationship2'])->chunk(500, function($resources) {
$resources->each(function($resource) {
$this->convertToExcelRow($resource);
$this->convertToAnotherExcelRow($resource->joinedTable);
});
});
备注:
尝试使用 block 大小(500 只是一个示例)。在这种情况下,您应该对表中的每 500 行进行 2 次查询。如果您选择 5000,您的查询可能会减少 10 倍,但由于请求的连接数量增加,您的加载时间可能不会缩短。
关于php - Laravel > Eloquent 批量加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100603/