这有效(版本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中)。
有什么办法解决这个问题吗?
答案 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表中检索您的列,这将防止在模型中输入错误的值。