groupBy正在删除渴望的加载关系吗?

时间:2019-05-24 19:23:29

标签: laravel laravel-5

这有效(版本A):

$applications=  Apply::with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')->get();
dd($applications);

以下是所有关系的输出:

enter image description here

现在,我想在最新的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模型已正确排序。但是,大多数关系都不再加载:

enter image description here

基本上,只渴望加载关系user,而其他关系newUserrequests.*不在版本B中加载(但在版本A中)。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在雄辩的模型上使用join时,如果两个表中的列都相同(通常为id),则可能会发生一些异常情况。

我的直觉是,您急切的加载发生在applyRequest表ID上,而不是apply表ID上,因为雄辩(出于某种原因)使用错误的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函数将意味着查询仍将联接数据,但仅从apply表中检索您的列,这将防止在模型中输入错误的值。