Laravel中如何在模型内检查Token是否过期?
解决Laravel Token过期检查的Scope问题
首先得说你这个Scope写法有两个关键问题,所以才会始终返回false:
问题1:Scope里误用了$this而非查询构建器
Laravel的查询作用域(Scope)参数里的$query才是要操作的查询构建器实例,而$this是当前的模型对象,用它调用where根本不会修改查询链,反而会生成一个新的独立查询,最后调用exists()自然得不到正确结果。
问题2:Scope不该直接返回布尔值
Scope的设计是用来修改查询构建器,给查询添加通用条件的,而不是直接执行查询返回结果。你应该把exists()的调用放到Scope外面,让Scope只负责添加“过期”这个过滤条件。
正确的Scope写法
先把Scope改成这样,只专注于添加过期的查询条件:
use Carbon\Carbon; public function scopeExpired($query) { return $query->where('expires_at', '<=', Carbon::now()); }
如何使用这个Scope检查过期
比如你要验证某个用户的指定Token是否过期,可以这样调用:
// 示例:检查user_id=1、token=12345的记录是否过期 $isExpired = Token::where('user_id', 1) ->where('token', '12345') ->expired() ->exists();
如果已经拿到了Token模型实例(比如从数据库查询出来的),其实更简单,直接对比时间就行,不用走Scope:
$tokenModel = Token::where('token', '12345')->first(); $isExpired = $tokenModel->expires_at <= Carbon::now();
额外补充:生成新Token时自动设置7天有效期
你提到生成新Token时有效期设为7天,可以在模型的创建逻辑里自动处理,比如在模型的boot方法里添加创建钩子:
protected static function boot() { parent::boot(); static::creating(function ($token) { $token->expires_at = Carbon::now()->addDays(7); }); }
这样以后创建Token的时候,只要传入user_id和token值,expires_at会自动设为当前时间加7天,不用每次手动编写。
内容的提问来源于stack exchange,提问作者Dumitru
相关产品推荐
相关产品推荐

