Laravel выбирает записи старше 5 минут?

У меня есть приложение 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'); 

Related of "Laravel выбирает записи старше 5 минут?"

Предполагая, что ваша бизнес-логика верна, попробуйте использовать 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();