我有登录历史记录表,其中保存了每个用户的登录/注销信息,因此每个用户可以有很多行。
我正在尝试进行过滤以一次获取每个用户的最后一行(获取所有用户的最新行),但不确定如何操作。
controller
$histories = LoginHistory::with(['user','user.roles' => function($q) {
return $q->latest()->first();
}])->get();
这将返回所有用户的所有行,而不仅仅是最新行。
在这种情况下,我的函数应该返回3个结果,因为ID为1的用户有2行(我只需要获取最新的row 2
),但是我的函数却得到了全部4行。
有什么主意吗?
答案 0 :(得分:0)
您可能在此处使用的原始MySQL查询如下所示:
SELECT lh1.*
FROM login_history lh1
INNER JOIN
(
SELECT user_id, MAX(login) AS max_login
FROM login_history
GROUP BY user_id
) lh2
ON lh1.user_id = lh2.user_id AND lh1.login = lh2.max_login
您更新的Laravel /口才代码:
$subquery = DB::table('login_history')
->select(DB::raw("user_id, MAX(login) AS max_login"))
->groupBy('user_id');
$rs = LoginHistory::joinSub($subquery, 'lh2', function($join) {
$join->on('login_history.user_id', '=', 'lh2.user_id');
$join->on('login_history.login', '=', 'lh2.max_login');
})
->select(['login_history.*'])
->get();