gpt4 book ai didi

laravel - 游标中的 Eloquent Eager Loading(惰性集合)

转载 作者:行者123 更新时间:2023-12-05 02:53:28 25 4
gpt4 key购买 nike

我正在尝试从我的数据库中导出大量记录,但我需要关系数据才能正确构建导出。理想情况下,我可以使用 cursor() 来获得惰性集合,但这不会加载关系。我无法在循环中加载关系,因为这会创建 N+1 个查询,而且这可能是数十万个额外的查询,这是 Not Acceptable 。

这是“有效”的(但内存不足):

Record::with('projects')->get()->map(function ($record) {
dd($record); // Shows the `projects` relationship
});

但是当我使用 cursor()...

Record::with('projects')->cursor()->map(function ($record) {
dd($record); // Does NOT show the `projects` relationship
});

有没有办法获得包含记录关系的惰性集合?我查看了文档,并不清楚。其他建议是使用 chunk(),不幸的是,在这种情况下这是不可能的。

编辑:我不应该说 block 是不可能的,但它是一个非常昂贵的重写。目前,数据的结构具有很大的可变性。因此,为了构建用于导出的 CSV,我需要(例如)文件的标题。我目前通过遍历所有记录(字段存储在 JSONB 字段中)并根据这些记录中存在的字段构建一个数组来获取该 header 。

我还根据这些 header 规范化数据。因此,如果一条记录有字段“address-1”而另一条记录没有该字段,则没有该字段的记录会在相应的列中显示空白值。否则,将行插入 CSV 时,它不会考虑标题。

这些操作目前抓取整个数据集并使用 LazyCollection 映射标题并对记录进行规范化,然后一次将其送入 CSV。如果我也可以在 LazyCollection 中获取关系而不必重写工作流,那就太理想了。

最佳答案

根据 this doc

游标在 db 阶段工作,而加载关系在方法 'get' 或 'first' 之后......

所以:游标中的代码将在整体结果之前在表示为模型实例的数据库行中工作,这意味着此代码将运行到数据库中,而不加载关系,再次运行到数据库行(遍历您的数据库记录...)

如果您不能使用 chunk... 那么我认为您可以使用 mySql 来管理您的数据 raw-expressions

关于laravel - 游标中的 Eloquent Eager Loading(惰性集合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62220385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com