Laravel选择超过5分钟的记录?

use*_*495 10 php sql laravel-4

我有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');
Run Code Online (Sandbox Code Playgroud)

我的问题是,这不起作用.如果我将操作数更改为<=,它将在5分钟之前立即将我注销,如果操作数是>=,即使在5分钟后它也不会让我退出,有人可以解释原因吗?

-编辑-

感谢所有的答案,我通过修改我的代码解决了我的问题:

$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');
Run Code Online (Sandbox Code Playgroud)

Ben*_*ins 40

接受的答案是正确的,但您可以通过在User模型上使用查询范围使其更清晰(假设您有用户模型)...

$result = User::currentUser()->activityOlderThan(self::HEARTBEAT_INTERVAL)->get();
Run Code Online (Sandbox Code Playgroud)

您的用户模型将具有以下功能:

public function scopeCurrentUser($query)
{
    return $query->where('id_user', '=', Session::get('id_user'));
}
Run Code Online (Sandbox Code Playgroud)

public function scopeActivityOlderThan($query, $interval)
{
    return $query->where('last_activity', '>=', Carbon::now()->subMinutes($interval)->toDateTimeString());
}
Run Code Online (Sandbox Code Playgroud)

现在您的代码干净且易于阅读:-)


Gla*_*elp 29

假设您的业务逻辑正确,请尝试在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();
Run Code Online (Sandbox Code Playgroud)

此外,最好始终输出执行的SQL查询,以确保Laravel按预期运行:

$queries = DB::getQueryLog();
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用Carbon(默认包含在Laravel中)来创建格式化的日期:`$ formatted_date = Carbon :: now() - > subMinutes(5) - > toDateTimeString();` (9认同)