Laravel Spatie Permission查询出现model_type值错误问题求助
问题排查与解决思路
核心原因分析
查询时model_type变成1,大概率是因为项目配置了Laravel模型多态映射(morphMap),导致Spatie权限系统用映射ID替代了完整的模型类名进行查询,而你手动插入数据库的是类名App\Models\User,两者不匹配导致功能失效。
具体排查与解决步骤
检查多态映射配置
打开app/Providers/AppServiceProvider.php,查看boot方法中是否存在类似代码:use Illuminate\Database\Eloquent\Relations\Relation; public function boot() { Relation::morphMap([ 1 => App\Models\User::class, // 其他模型映射... ]); }如果存在该配置,说明系统会用映射ID(比如
1)存储model_type,而非完整类名。两种修复方案
方案一(保留morphMap):
手动修改model_has_roles表中的model_type为映射ID1,或者用代码分配角色(推荐,避免手动操作出错):$user = App\Models\User::find(123); $user->assignRole('Admin');代码会自动根据映射规则写入正确的
model_type值。方案二(移除morphMap):
删除AppServiceProvider中的morphMap代码,然后清理缓存:php artisan cache:clear php artisan config:clear php artisan permission:cache-reset之后系统会直接用完整类名
App\Models\User进行查询,与你手动插入的数据库记录匹配。
额外检查项
- 确认
User模型正确引入Spatie的trait:use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; // ...其他代码 } - 检查是否重写了模型的
getMorphClass()方法,该方法会影响多态关联的类型值。
- 确认
内容的提问来源于stack exchange,提问作者MyLoveIsSharks
相关产品推荐
相关产品推荐

