首页 > 解决方案 > 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是预先加载的,其他关系newUserrequests.*没有在版本 B 中加载(但在版本 A 中)。

任何想法如何解决这一问题?

标签: laravellaravel-5

解决方案


当您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功能将意味着查询仍将连接数据,但只会检索应用表中的列,这将防止将错误的值放入模型中。


推荐阅读