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:创造雄辩的范围的主要内容,如果未能解决你的问题,请参考以下文章

如何编写相同的代码并以雄辩的关系获取相同的数据... laravel

Laravel 5 雄辩的查询混淆

Laravel 5.4雄辩的一对多关系

雄辩的laravel错误

Laravel - 雄辩的自我关系

Laravel 4.2 雄辩的动态查询