Laravel返回所有用户的最新历史记录

时间:2019-12-18 01:39:28

标签: php laravel

我有登录历史记录表,其中保存了每个用户的登录/注销信息,因此每个用户可以有很多行。

我正在尝试进行过滤以一次获取每个用户的最后一行(获取所有用户的最新行),但不确定如何操作。

代码

controller

$histories = LoginHistory::with(['user','user.roles' => function($q) {
  return $q->latest()->first();
}])->get(); 
  

这将返回所有用户的所有行,而不仅仅是最新行。

屏幕截图

table one

在这种情况下,我的函数应该返回3个结果,因为ID为1的用户有2行(我只需要获取最新的row 2),但是我的函数却得到了全部4行。

有什么主意吗?

1 个答案:

答案 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();