Laravel 10移动User模型到新命名空间后报类找不到错误
问题分析
从错误栈能明确看出,报错根源是Laravel Sanctum的PersonalAccessToken模型在执行morphTo关联时,仍尝试加载旧命名空间的App\Models\User类——这是因为数据库中personal_access_tokens表的tokenable_type字段还存储着旧的模型命名空间值,迁移User模型后未同步更新这些历史数据。
解决方案
1. 更新数据库中的历史Token记录
执行SQL语句,将personal_access_tokens表中旧的模型命名空间替换为新的:
UPDATE personal_access_tokens SET tokenable_type = 'App\\Models\\V1\\User' WHERE tokenable_type = 'App\\Models\\User';
如果通过Laravel的DB门面执行,注意转义写法:
\DB::table('personal_access_tokens') ->where('tokenable_type', 'App\Models\User') ->update(['tokenable_type' => 'App\Models\V1\User']);
2. 确认Sanctum关联配置正确性
若后续生成的Token仍出现同类问题,需检查:
config/auth.php中所有guard的provider对应的model已更新为App\Models\V1\User- 若自定义了Sanctum的
PersonalAccessToken模型,需确保其tokenable关联指向正确的模型;也可在User模型中明确Sanctum的关联规则:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens; // 可选:明确指定Sanctum Token模型的关联 public function tokens() { return $this->morphMany(\Laravel\Sanctum\PersonalAccessToken::class, 'tokenable'); } }
3. 重新清理缓存并生成Autoload
执行以下命令确保配置和类加载规则完全生效:
php artisan config:clear php artisan cache:clear composer dump-autoload
内容的提问来源于stack exchange,提问作者Ger Pera
相关产品推荐
相关产品推荐

