Laravel:创造雄辩的范围

问题描述 投票:1回答:3

嘿同事们,

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

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

php database laravel-4 eloquent
3个回答
0
投票

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

现在我正在使用此代码来定义范围,它就像一个魅力!我从令牌表中删除了“expires”列,并将其替换为:

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)));
}

0
投票

你的MySQL问题的解决方案(PostgreSQL会更容易,相应的其他引擎):

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

0
投票

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

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

MySQL 3.23+

© www.soinside.com 2019 - 2024. All rights reserved.