我有一个雄辩的多对多关系,我想使用 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() 方法中?感谢你们。
错误
字段“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.*)按预期工作
| 归档时间: |
|
| 查看次数: |
3707 次 |
| 最近记录: |