具有可为空外键的 Laravel 数据透视表
题
我有一个数据透视表,设置如下:
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
在表中。
出了什么问题?
解决方案
如果您不提供钥匙 attach
/sync
, ,Eloquent不会插入任何东西。这是相当预期的行为,因为您想要做的是:
在 X 和 null 之间创建链接
这不是 ORM 应该做的。
而是手动插入这些行:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);
不隶属于 StackOverflow