Laravel雄辩附加自动生成随机ID

Laravel雄辩附加自动生成随机ID,laravel,eloquent,Laravel,Eloquent,我有一个雄辩的多对多关系,我想使用attach()轻松创建角色权限数据,但问题是我使用UUID作为我的ID,它抛出一个错误字段“ID”没有默认值。有没有劫持attach()方法的方法?这样我就可以设置UUID了 我的迁移 Schema::create('role_permissions', function (Blueprint $table) { $table->increments('count')->unique(); $table->s

我有一个雄辩的多对多关系,我想使用attach()轻松创建角色权限数据,但问题是我使用UUID作为我的ID,它抛出一个错误字段“ID”没有默认值。有没有劫持attach()方法的方法?这样我就可以设置UUID了

我的迁移

 Schema::create('role_permissions', function (Blueprint $table) {
        $table->increments('count')->unique();
        $table->string('id')->unique();
        $table->string('role_id');
        $table->string('permission_id');
        $table->timestamps();
    });
我的模型

class Role extends Model
{
  //
public $incrementing = false;

public function users()
{
    return $this->belongsToMany('App\User', 'user_roles', 'role_id', 'user_id');
}

public function permissions()
{
    return $this->belongsToMany('App\Permission', 'role_permissions', 'role_id', 'permission_id');
}
}
我的附加代码

 $role->permissions()->attach($permission_ids);
我知道这里的问题是我的id不是一个递增的数字,而是一个唯一的字符串。我的问题是如何将唯一的字符串“注入”到attach()方法?谢谢大家。

错误

字段“id”没有默认值

指数据库不知道如何填充未指定的
id
字段

您可以编辑架构并添加可为空的:

 Schema::create('role_permissions', function (Blueprint $table) {
    $table->increments('count')->unique();
    $table->string('id')->unique()->nullable(); // Bad idea
    $table->string('role_id');
    $table->string('permission_id');
    $table->timestamps();
});
或通过连接将其注入:

 $role->permissions()->attach($permission_ids, ["id" => null]);
更多信息

更新

对于遇到此问题的未来开发人员,您还可以在附加阵列中设置任何内容,例如:

$role->permissions()->attach($permission_ids, ["id" => Uuid::generate()]);
更新2

老实说,还有一种更干净的处理方法。我会尽力解释的

只需挂接到
boot
方法,即可在事件服务提供程序内处理Pivot事件:

这里有一个片段

/App/Providers/EventServiceProvider.php
    public function boot()
    {
    Pivot::creating(function($pivot) {
        if ($pivot->getTable() == 'role_permissions') {
            $pivot->id = Uuid::generate();
        }
    });
    }
请注意,我不知道这在您的laravel版本中是否实际可行。矿山(5.4.*)按预期工作


好吧,我在克劳迪奥·卢多维科·帕内塔的提示下成功地解决了这个问题

foreach($permission_ids as $permission_id)
    {
        $role->permissions()->attach($permission_id, ["id" => Uuid::generate()]);
    }

如果您已经正确设置了模型和数据库,这应该不是问题,您可以发布数据库和模型代码吗?您可以发布您的
代码吗?
?基本上没有模型,因为我使用的是多对多关系。因此,attach只需创建一个查询并执行它。代码现在添加到@ParasThis works,但id的值将重复。我不想把id设为空,让它工作吧。是我干的。foreach($permission\u id as$permission\u id){$role->permissions()->attach($permission\u id,[“id”=>Uuid::generate());}很高兴听到您理解了解决方案。