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?

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top