2013-10-20 8 views
6

私は3分ごとにハートビートで定期的にログインしたユーザを確認するLaravelアプリを持っています(デモの目的、実際は5分)。ビートごとに、ユーザーの現在の最後のアクティビティも5分かどうかを確認します。そうであれば、ログアウトしてください。5分以上経過したLaravel selectレコード?

$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分後でもログアウトされません。理由を説明できますか?

-EDIT-

すべての答えのおかげでは、私は自分のコードを変更することで、私の問題を解決:あなたのビジネスロジックが正しいと仮定すると

$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

、代わりにあるSQL文字列のPHPを使用してみてください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(); 

はまた、それだけで期待通りLaravelの動作を確認するために、常に出力に実行されるSQLクエリをお勧めです。

$queries = DB::getQueryLog(); 
+0

おかげで、私もあなたを試みたが、それは動作します。 D – user2002495

+6

あなたはCarbon(デフォルトではLaravelに含まれています)を使用して、フォーマットされたファイルを作成することもできます。これは、あなたの時間のために受け入れられアップアップされました。 date: '$ formatted_date = Carbon :: now() - > subMinutes(5) - > toDateTimeString();' – murze

27

受け入れ答えが正しいですが、Userモデル(あなたは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()); 
} 
:モデルは、これらの機能を持っているでしょう

今、あなたのコードは、あなたがwhereRaw()を使用することができます:-)

1

読み取るために、クリーンで簡単です:

$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(); 
関連する問題