2013-10-20 21 views
6

我有Laravel应用程序,我检查用户每3秒(示范目的,实际上5分钟)定期用心跳登录。对于每个节拍,我检查用户当前时间的最后一项活动是否也是5分钟。如果是,请将其注销。Laravel选择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分钟后它不会将我注销,任何人都可以解释原因吗?

CNC中

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

$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'); 

回答

24

假设你的业务逻辑是正确的,请尝试使用PHP,而不是一个SQL字符串中的在where条款:

$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(); 
+0

感谢,我想你也和它的作品。由于你的回答时间而被接受和提高,无论如何,我已经用自己的代码解决了这个问题(请参阅编辑),非常感谢您的时间:D – user2002495

+6

您也可以使用Carbon(默认包含在Laravel中)创建格式化date:'$ formatted_date = Carbon :: now() - > subMinutes(5) - > toDateTimeString();' – murze

27

接受的答案是正确的,但你可以使它即使在使用查询范围的用户模型(假设你有一个用户模式)清洁...

$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

您可以使用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();