我有很多很多关系,我想使用attach()轻松创建role_permissions数据,但问题是我正在使用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()方法“注入”该唯一字符串?谢谢你们。
答案 0 :(得分:1)
错误
Field' 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]);
更新
对于遇到此问题的未来开发人员,您还可以在attach数组中设置任何内容,例如:
$role->permissions()->attach($permission_ids, ["id" => Uuid::generate()]);
更新2
说实话,还有一种更干净的方法来处理这个问题。我会尝试解释一下。
您只需挂钩boot
方法即可处理事件服务提供商内的数据透视事件:
这是一个片段
/App/Providers/EventServiceProvider.php
public function boot()
{
Pivot::creating(function($pivot) {
if ($pivot->getTable() == 'role_permissions') {
$pivot->id = Uuid::generate();
}
});
}
请注意我不知道您的laravel版本是否实际可行。我的(5.4。*)按预期工作
答案 1 :(得分:0)
好的设法修复了它,我在@Claudio Ludovico Panneta的帮助下做了什么。
When I fill in "article_Titulo" with "Sta Uors" # features/step_definitions/teste1.rb:24
Unable to find field "article_Titulo" (Capybara::ElementNotFound)
./features/step_definitions/teste1.rb:25:in `/^I fill in "(.*)" with "(.*)"/'
features/teste1.feature:18:in `When I fill in "article_Titulo" with "Sta Uors"'