我设置了一个数据透视表,如下所示:
user_roles
user_id //fk->users.id
assoc_id //nullable fk->association.id
role //varchar
我以这种方式设置我的数据库,因为角色代表了多对多的关系:一个关联有很多用户,一个用户可能有许多关联。每个用户都在协会中有一个角色。
但是,存在一些可以存在于关联之外的角色。数据库配置为接受assoc_id
字段中的空值,我可以从命令行手动插入一个,但是当我尝试执行时
$user->roles()->attach(NULL, "outside contractor");
在我的种子文件中,我收到错误说
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update
a child row: a foreign key constraint fails (`database`.`user_roles`, CONSTR
AINT `user_roles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users
` (`id`)) (SQL: insert into `user_roles` () values ())
这特别令人困惑,因为这里的第一个论点不应该指的是assoc_id
吗?当我将NULL
替换为有效的assoc_id
时,
$user->roles()->attach(1, "outside contractor");
插入工作正常,第一个参数引用表中的assoc_id
。
出了什么问题?
答案 0 :(得分:2)
如果您没有为attach
/ sync
提供密钥/密钥,则Eloquent不会插入任何内容。这是相当预期的行为,因为你要做的是:
在X和null之间创建一个链接
这不是ORM应该做的。
而是手动插入这些行:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);