【问题标题】:Laravel select records older than 5 minutes?Laravel 选择超过 5 分钟的记录?
【发布时间】:2013-10-28 20:17:57
【问题描述】:

我有 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');

我的问题是,这不起作用。如果我将操作数更改为<=,它会在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 laravel-4


    【解决方案1】:

    接受的答案是正确的,但您可以通过在 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());
    }
    

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

    【讨论】:

      【解决方案2】:

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

      此外,最好始终输出已执行的 SQL 查询,以确保 Laravel 的行为符合预期:

      $queries = DB::getQueryLog();
      

      【讨论】:

      • 谢谢,我也试过你的,它有效。由于您有时间回答,接受并投票赞成,无论如何我已经用自己的代码解决了问题(请参阅编辑),非常感谢您的时间:D
      • 你也可以使用 Carbon(默认包含在 Laravel 中)来创建格式化日期:$formatted_date = Carbon::now()-&gt;subMinutes(5)-&gt;toDateTimeString();
      • @murze 我知道这不是一个有确切答案的问题,但使用 Datetime 或 Carbon 有什么区别?
      • @Charlie:不同之处在于问题与 Laravel 相关,而 Carbon 是 Laravel API 的一部分
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 2021-04-21
        相关资源
        最近更新 更多