当用户从多台计算机登录我的网站时,我注意到我的应用程序中存在一个错误,它们在登录列表中显示两次。我设法通过在我的查询中添加groupBy('user_id')
来解决此问题,但是我现在注意到其他错误:用户的最后一个活动字段仅更新其中一个。
return $query->whereNotNull('user_id')->with('user')->groupBy('user_id')->get();
为了使这一点更加清晰,在添加groupBy
之前,假设用户Bob在2个位置登录。我登录的用户看起来像这样:
Bob Last Active 1 hour ago, Bob Last Active 6 minutes ago
但是,对于groupBy
,它可能会显示:
Bob Last Active 1 hour ago
即使最近的活动是6分钟前。我尝试运行sortBy('last_activity')
,但升序和降序都无法解决此问题。有没有人有任何想法?
感谢。
答案 0 :(得分:1)
很难说问题是因为您没有解释您在该表中存储的内容以及存储方式。我猜你用的是数据库会话驱动程序吗?
无论如何,每个用户会话对于给定位置是唯一的。这就是当用户在多个位置登录时获得2个条目的原因。如果不与其他位置共享cookie,则此处的“位置”被认为是不同的(例如,私人浏览窗口就足够了)。 Laravel中的会话由会话cookie laravel_session
标识。
我建议您的“上次有效”时间戳是将其直接存储在User
模型中,并在用户访问您的网站时进行更新。与尝试重新构建活动会话中的信息相比,将此与用户持久保存更有意义。此外,最终会删除陈旧的会话,并且会丢失用户的信息。
group by
适用于aggregate functions。你想要的是这样的:
SELECT user_id, MAX(last_activity)
FROM SessionTable WHERE user_id IS NOT NULL
GROUP BY user_id
使用查询构建器:
\DB::table('session_table')
->select('user_id', \DB::raw('max(last_activity) as last_activity'))
->whereNotNull('user_id')
->groupBy('user_id')
->lists('user_id', 'last_activity');
应该返回这样的内容:
[
'user_id1' => 'last_activity1',
'user_id2' => 'last_activity2',
...
]