tabela dinâmica laravel com chave estrangeira anulável
Pergunta
Eu tenho uma tabela dinâmica configurada da seguinte forma:
user_roles
user_id //fk->users.id
assoc_id //nullable fk->association.id
role //varchar
Configurei meu banco de dados dessa maneira porque as funções representam um relacionamento muitos para muitos:uma associação tem muitos usuários e um usuário pode estar em muitas associações.cada usuário tem uma função dentro de uma associação.
No entanto, existem algumas funções que podem existir fora de uma associação.O banco de dados está configurado para aceitar um valor nulo no assoc_id
campo e posso inserir manualmente um na linha de comando, mas quando tento executar
$user->roles()->attach(NULL, "outside contractor");
no meu arquivo seed, recebo um erro dizendo
[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 ())
isso é particularmente confuso porque o primeiro argumento aqui não deveria estar se referindo ao assoc_id
?Quando eu substituir o NULL
com um válido assoc_id
,
$user->roles()->attach(1, "outside contractor");
a inserção funciona bem e o primeiro argumento refere-se ao assoc_id
na mesa.
O que está errado?
Solução
Se você não fornecer uma chave/chaves para attach
/sync
, o Eloquent não inserirá nada.É um comportamento bastante esperado, já que o que você está tentando fazer é:
Crie um link entre X e nulo
não é isso que o ORM deve fazer.
Em vez disso, insira essas linhas manualmente:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);