Laravel:创造雄辩的范围

时间:2014-06-24 10:55:48

标签: php database laravel-4 eloquent

嘿同事们,

我正在以雄辩的方式尝试一点点,并遇到了一些麻烦。 我的令牌表现在看起来像这样:

Table Token
email (VARCHAR 255)
token (VARCHAR 255)
expires (VARCHAR 255)  // this should probably be int.. 
created_at timestamp

在我的令牌模型中,我正在构建一个范围来检索所有过期的令牌

public function scopeExpired($query)
{
    return $query->where('created_at', '<', date('Y-m-d H:i:s', time()-   ('expires'*60)));
}

这几乎可以解决问题,但忽略了('过期'* 60)。如果我用一个数字代替'expires',那就说30,它完美无缺。

我的问题基本上归结为:我如何使用expires列的相应行的值?

非常感谢任何帮助!

此致 Pwnball

3 个答案:

答案 0 :(得分:0)

所以,我解决了这个问题!我没有设法获得相应列的值,但我认为在配置中存储令牌的过期时刻是明智的。

现在我使用此代码来定义范围,它就像一个魅力! 我删除了&#39;到期&#39;令牌表中的列,并将其替换为:

type varchar 50

当我知道我在代码中的每个特定点使用什么类型的令牌时,这解决了困境并导致更容易维护的代码!双赢!

public function scopeExpired($query, $type)
{
    $expires = Config::get('app.tokenExpiration.'.$type, 30);
    return $query->where('created_at', '<', date('Y-m-d H:i:s', time()-($expires*60)));
}

答案 1 :(得分:0)

解决你的MySQL问题(PostgreSQL会更简单,其他引擎也相应):

public function scopeExpired($query)
{
  return $query->where('created_at', '<', 
     DB::raw('timestampadd(hour, -expires, now())'
  );
}

答案 2 :(得分:0)

使用查询构建器的whereRaw()方法编写原始SQL,即

return $query->whereRaw("`created_at` < DATE_SUB(NOW(), INTERVAL `expires` MINUTE)");

MySQL 3.23 +

相关问题