laravel - groupBy 正在删除急切加载的关系?
问题描述
这有效(版本 A):
$applications= Apply::with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')->get();
dd($applications);
这是所有关系的输出:
现在我想Apply
按最新订购型号request.updated_at
。为此,我添加了这个(版本 B):
$application = Apply::with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')
->join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')
->groupBy('apply.id')
->orderByRaw('max(applyRequest.updated_at) desc')
->get();
这解析为正确的 sql
"select * from `apply` inner join `applyRequest` on `applyRequest`.`apply_id` = `apply`.`id` group by `apply`.`id` order by max(applyRequest.updated_at) desc"
并且Apply
模型正确排序。但是,大多数关系不再加载:
基本上,只有关系user
是预先加载的,其他关系newUser
并requests.*
没有在版本 B 中加载(但在版本 A 中)。
任何想法如何解决这一问题?
解决方案
当您join
在 eloquent 模型上使用时,如果两个表中的列相同(通常是id
),可能会发生一些不寻常的事情。
我的预感是,您的急切加载发生在applyRequest
表 id 上,而不是apply
表 id,因为 eloquent(无论出于何种原因)使用错误的 id 值来构建模型。这可能会导致您的急切加载错误或不存在。
您可以通过两次转储模型来测试这一点,一次有连接,一次没有连接,然后比较值。
dump(Apply::get());
dump(Apply::join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')->get());
如果值不同,请尝试以下操作:
$application = Apply::select('apply.*')
->with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')
->join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')
->groupBy('apply.id')
->orderByRaw('max(applyRequest.updated_at) desc')
->get();
新select
功能将意味着查询仍将连接数据,但只会检索应用表中的列,这将防止将错误的值放入模型中。
推荐阅读
- node.js - 如何解决 react-native-spotify-remote 的这个 NPM 依赖问题
- arrays - Unexpected output for this following code
- tensorflow - WSL2-$nvidia-smi 命令未运行
- python-3.x - 开发包时如何使用诗歌?
- java - 本地主机中的Mysql
- javascript - 如何从 javascript 中的方法引用中检索类?
- flutter - 在 Dart 中获取每个项目列表的平均值的最干净的方法是什么?
- javascript - 如何正确构建 React 模块化库
- sql - SQL 计算每一行的不同值
- c# - 将列表标识与模板进行比较