Laravel Spatie assignRole()启用Team时失效问题排查
解决Laravel Spatie权限包teams模式下角色分配异常问题
问题根源
你用User::where('id', 1)->get()和Role::where('id', 1)->get()获取的是模型集合(Collection),而非单个模型实例。集合本身没有id属性,哪怕集合内的单个模型包含id字段,直接访问$role->id仍会抛出「Property [id] does not exist on this collection instance」异常。
修复方案
将get()替换为first(),获取单个模型实例:
// 修正后的代码 $user = User::where('id', 1)->first(); $role = Role::where('id', 1)->first(); // 执行角色分配 $user->assignRole([$role->id]);
或者用更简洁的find()方法直接通过ID获取模型:
$user = User::find(1); $role = Role::find(1); $user->assignRole([$role->id]);
额外说明
开启Spatie权限包的teams=true配置后,角色分配会增加团队关联逻辑,但本次异常的核心原因与teams配置无关,纯粹是获取模型的方式错误——误用了返回集合的get(),而非返回单个实例的first()/find()。
内容的提问来源于stack exchange,提问作者drphp
相关产品推荐
相关产品推荐

