【发布时间】:2016-02-09 23:29:17
【问题描述】:
我有两个表,分别是“users”和“users_actions”,其中“users_actions”与用户有 hasMany 关系:
用户
id | name | surname | email...
行动
id | id_action | id_user | log | created_at
模型用户.php
class Users {
public function action()
{
return $this->hasMany('Action', 'user_id')->orderBy('created_at', 'desc');
}
}
现在,我想检索所有用户的列表以及他们的最后一次操作。
我看到这样做Users::with('action')->get();
只需获取关系的第一个结果,就可以轻松地给我最后的操作:
foreach ($users as $user) {
echo $user->action[0]->description;
}
但我当然想避免这种情况,只为每个用户选择最后一个操作。
我尝试使用约束,例如
Users::with(['action' => function ($query) {
$query->orderBy('created_at', 'desc')
->limit(1);
}])
->get();
但这给了我一个不正确的结果,因为 Laravel 执行了这个查询:
SELECT * FROM users_actions WHERE user_id IN (1,2,3,4,5)
ORDER BY created_at
LIMIT 1
这当然是错误的。有没有可能在不使用 Eloquent 对每条记录执行查询的情况下得到这个? 我是否犯了一些我没有看到的明显错误?我对使用 Eloquent 还是很陌生,有时人际关系会困扰我。
编辑:
出于代表性目的,我还需要此功能来在关系中搜索,例如我想搜索 LAST ACTION = 'something' 的用户
我尝试过使用
$actions->whereHas('action', function($query) {
$query->where('id_action', 1);
});
但这给了我所有有一个动作 = 1 的用户,因为它是一个日志,所以每个人都通过了那一步。
编辑 2:
感谢@berkayk,看来我解决了问题的第一部分,但我仍然无法在关系中搜索。
Actions::whereHas('latestAction', function($query) {
$query->where('id_action', 1);
});
仍然没有执行正确的查询,它会生成如下内容:
select * from `users` where
(select count(*)
from `users_action`
where `users_action`.`user_id` = `users`.`id`
and `id_action` in ('1')
) >= 1
order by `created_at` desc
我需要获取 latest 动作为 1 的记录
【问题讨论】:
-
天啊! 编辑过多,有关简洁的问题和答案,请参阅:stackoverflow.com/q/53837614/8740349
标签: php laravel eloquent greatest-n-per-group eager-loading