使用Spatie权限时assignRole()导致model_has_role的model_id为0
解决Spatie权限包ULID配置后assignRole()导致model_id为0的问题
配置Spatie权限包使用ULID时,调用assignRole()后model_has_role表的model_id字段值为0,而非用户对应的ULID,可通过以下步骤解决:
1. 修正User模型配置
确保User模型正确配置ULID相关属性,明确主键类型:
use Illuminate\Database\Eloquent\Concerns\HasUlids; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasUlids; protected $primaryKey = 'ulid'; protected $keyType = 'string'; public $incrementing = false; // 其他原有代码... }
2. 调整权限包配置文件
修改config/permission.php中的column_names配置,指定角色、权限的关联键以及模型的形态键:
'column_names' => [ 'role_pivot_key' => 'role_ulid', // 对应Role模型的主键ulid 'permission_pivot_key' => 'permission_ulid', // 对应Permission模型的主键ulid 'model_morph_key' => 'model_ulid', // 对应关联表中的模型ULID字段 'team_foreign_key' => 'team_id', ],
3. 更新数据库关联表结构
关联表(model_has_roles、model_has_permissions)需要适配ULID,替换原有的自增ID字段:
- 创建迁移文件修改
model_has_roles表:
Schema::table('model_has_roles', function (Blueprint $table) { // 删除原有自增ID字段 $table->dropColumn(['model_id', 'role_id']); // 添加ULID类型的关联字段 $table->string('model_ulid'); $table->string('role_ulid'); // 设置外键关联 $table->foreign('role_ulid')->references('ulid')->on('roles')->onDelete('cascade'); });
- 同理修改
model_has_permissions表,添加model_ulid和permission_ulid字段并设置外键。
4. 完善Role和Permission模型
确保角色、权限模型完整配置ULID属性:
class Role extends SpatieRole { use HasFactory, HasUlids; protected $primaryKey = 'ulid'; protected $keyType = 'string'; public $incrementing = false; protected $fillable = [ 'name', 'guard_name', ]; }
Permission模型做相同配置即可。
5. 验证种子文件执行逻辑
确保用户创建后ULID已正确生成,再执行角色分配:
$user = User::create([ // 用户字段配置... ]); setPermissionsTeamId(1); // 确认用户ULID存在后分配角色 $user->assignRole('superadmin');
内容的提问来源于stack exchange,提问作者Martin Christopher
相关产品推荐
相关产品推荐

