具有可空外键的laravel数据透视表

时间:2014-07-29 05:12:04

标签: mysql laravel eloquent

我设置了一个数据透视表,如下所示:

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

出了什么问题?

1 个答案:

答案 0 :(得分:2)

如果您没有为attach / sync提供密钥/密钥,则Eloquent不会插入任何内容。这是相当预期的行为,因为你要做的是:

在X和null之间创建一个链接

这不是ORM应该做的。

而是手动插入这些行:

$data = [
   'user_id' => 99, 
   'assoc_id' => null, 
   'role' => 'outside contractor'
];

DB::table('user_roles')->insert($data);