php - Laravel > Eloquent 批量加载

标签 php mysql laravel eloquent

我需要使用 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/

相关文章:

PHP - 如何在 mysql_result 中指定 MySQL 行名称而不是数字

php - 如何在 php 中使用 api 调用将电子邮件地址添加到 mailchimp 列表

php - 销售税计算(城市限制与非城市限制)

javascript - 如何将 ajax $.get 值传递给 jQuery 中的另一个 $.get 函数?

mysql - 参数化表名

php - SQL GROUP BY 和 ORDER BY 无法正常工作

javascript - 向客户端提供个性化 JavaScript 代码

javascript - 使用 Chart.js 和 Laravel 将数据从 Controller 传递到 View

php - SQLSTATE[HY000] [2054] 服务器向客户端发送了未知的字符集。请向开发人员报告

php - HTML/PHP/SQL - 带参数的查询