У меня есть приложение Laravel, где я регулярно проверяю пользователя loggedin с биением на каждые 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 минут он не выйдет из системы, может ли кто-нибудь объяснить, почему?
-РЕДАКТИРОВАТЬ-
Спасибо за все ответы, я решил свои проблемы, изменив код:
$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');
Предполагая, что ваша бизнес-логика верна, попробуйте использовать PHP вместо строки SQL в предложении where
:
$date = new DateTime; $date->modify('-5 minutes'); $formatted_date = $date->format('Ymd 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();
Принятый ответ правильный, но вы можете сделать его еще более чистым, используя область запроса в модели пользователя (при условии, что у вас есть модель пользователя) …
$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()
:
$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();