我有Laravel应用程序,我每隔3秒检查用户定期登录心跳(演示目的,实际上是5分钟)。对于每个节拍,我检查用户当前时间的最后一次活动是否也是5分钟。如果是,请将其注销。
这是我的代码:
$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->where('last_activity','>=',"now() - interval 5 minute")->get();
if(!empty($result))
return Redirect::to('/logout');
else
return Response::json('still-alive');
我的问题是,这不起作用。如果我将操作数更改为<=
,它会在5分钟之前立即将我注销,如果操作数为>=
,即使在5分钟后它也不会将我注销,有人可以解释原因吗? / p>
- 编辑 -
感谢所有答案,我通过将代码修改为:
解决了我的问题$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->first();
if(!empty($result))
if(strtotime($result->last_activity) < strtotime("-5 minutes"))
return Redirect::to('/logout');
else
return Response::json('still-alive');
else
return Response::json('no-record');
答案 0 :(得分:38)
接受的答案是正确的,但您可以通过在User模型上使用查询范围使其更清晰(假设您有用户模型)...
$result = User::currentUser()->activityOlderThan(self::HEARTBEAT_INTERVAL)->get();
您的用户模型将具有以下功能:
public function scopeCurrentUser($query)
{
return $query->where('id_user', '=', Session::get('id_user'));
}
和
public function scopeActivityOlderThan($query, $interval)
{
return $query->where('last_activity', '>=', Carbon::now()->subMinutes($interval)->toDateTimeString());
}
现在您的代码干净且易于阅读: - )
答案 1 :(得分:28)
假设您的业务逻辑正确,请尝试在where
子句中使用PHP而不是SQL字符串:
$date = new DateTime;
$date->modify('-5 minutes');
$formatted_date = $date->format('Y-m-d H:i:s');
$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->where('last_activity','>=',$formatted_date)->get();
此外,最好始终输出执行的SQL查询,以确保Laravel按预期运行:
$queries = DB::getQueryLog();
答案 2 :(得分:2)
您可以使用whereRaw()
:
$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->whereRaw('last_activity >= now() - interval 5 minute')->get();
或
$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->whereRaw('last_activity >= now() - interval ? minute', [5])->get();