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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:06:10