You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:35