Laravel会话查询唯一用户

时间:2015-10-05 15:00:37

标签: php mysql session laravel

当用户从多台计算机登录我的网站时,我注意到我的应用程序中存在一个错误,它们在登录列表中显示两次。我设法通过在我的查询中添加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'),但升序和降序都无法解决此问题。有没有人有任何想法?

感谢。

1 个答案:

答案 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',
 ...
]