我有一个数据透视表,设置如下:

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top