Laravel eloquent Attach 自动生成随机 ID

Kea*_*ano 2 laravel eloquent

我有一个雄辩的多对多关系,我想使用 Attach() 轻松创建 role_permissions 数据,但问题是我使用 UUID 作为我的 ID,它会抛出错误 Field 'id' does not have a default value 。有什么方法可以劫持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();
    });
Run Code Online (Sandbox Code Playgroud)

我的模特

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');
}
}
Run Code Online (Sandbox Code Playgroud)

我的附加代码

 $role->permissions()->attach($permission_ids);
Run Code Online (Sandbox Code Playgroud)

我知道这里的问题是我的 id 不是一个递增的数字,而是一个唯一的字符串。我的问题是如何将唯一的字符串“注入”到 Attach() 方法中?感谢你们。

Cla*_*tta 5

错误

字段“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();
});
Run Code Online (Sandbox Code Playgroud)

或通过 Attach 注入它:

 $role->permissions()->attach($permission_ids, ["id" => null]);
Run Code Online (Sandbox Code Playgroud)

有关 Laravel 官方文档的更多信息

更新

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

$role->permissions()->attach($permission_ids, ["id" => Uuid::generate()]);
Run Code Online (Sandbox Code Playgroud)

更新2

老实说,还有一种更干净的方法来处理这个问题。我会尽力解释一下。

您可以通过简单地挂钩到该方法来处理事件服务提供者内部的Pivot 事件boot

这是一个片段

/App/Providers/EventServiceProvider.php
    public function boot()
    {
    Pivot::creating(function($pivot) {
        if ($pivot->getTable() == 'role_permissions') {
            $pivot->id = Uuid::generate();
        }
    });
    }
Run Code Online (Sandbox Code Playgroud)

请注意,我不知道这在您的 laravel 版本上是否可行。我的(5.4.*)按预期工作