Laravel:创造雄辩的范围
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel:创造雄辩的范围相关的知识,希望对你有一定的参考价值。
嘿同事们,
我正在以雄辩的方式尝试一点点,并遇到了一些麻烦。我的令牌表现在看起来像这样:
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
答案
所以,我解决了这个问题!我没有设法获得相应列的值,但我认为在配置中存储令牌的过期时刻是明智的。
现在我正在使用此代码来定义范围,它就像一个魅力!我从令牌表中删除了“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)));
}
另一答案
你的mysql问题的解决方案(PostgreSQL会更容易,相应的其他引擎):
public function scopeExpired($query)
{
return $query->where('created_at', '<',
DB::raw('timestampadd(hour, -expires, now())'
);
}
另一答案
使用查询构建器的whereRaw()
方法编写原始SQL,即
return $query->whereRaw("`created_at` < DATE_SUB(NOW(), INTERVAL `expires` MINUTE)");
MySQL 3.23+
以上是关于Laravel:创造雄辩的范围的主要内容,如果未能解决你的问题,请参考以下文章