我在数据库中有一个expired_at
列;在创建任何行时,默认情况下将是创建时间的未来5分钟,并且我想要排除expired_at
已经过去的行(从当前时间开始)。
例如,我在games
表中有这些行:
id creator_id created_at updated_at expire_at
1 123456789 2017-04-26 01:13:22 2017-04-26 01:13:22 2017-04-26 01:18:22
2 234567890 2017-04-26 01:16:06 2017-04-26 01:16:06 2017-04-26 01:21:06
当我在时间Game::all()
获取Game::where('condition')
或01:19:30
函数的所有行时,第1行不应被提取,但第2行应该,因为它仍未过期。
我不想在目标代码中处理过期时间,但是在模型代码中(例如覆盖模型类中的函数)
答案 0 :(得分:1)
你可以通过(全局)范围实现这一目标。
另请参阅this链接。
protected static function boot()
{
parent::boot();
static::addGlobalScope('not_expired', function (Builder $builder) {
$builder->where('expired_at', '>', Carbon::now());
});
}
全局范围将应用于所有查询,除非您专门禁用它们。
禁用它们可以通过以下方式完成:
Game::withoutGlobalScope('not_expired')->all();