Ao inserir uma entidade com associações, existe uma maneira de usar o FK em vez de recuperar a entidade?

Preciso inserir uma entidade que tenha associações.

Se eu já tenho os FK’s das entidades associadas, existe uma maneira de inserir a entidade primária no db com apenas os FK preenchidos?

Ou eu sempre tenho que

  • recuperar as entidades associadas através dos FK’s,
  • preencher as propriedades da entidade primária referentes às assocações,
  • e então invocar o método persistente.

   

Você quer um proxy de referência

Digamos que eu tenho posts e tags. Um Post tem muitas Tags. Recebo um monte de tags do usuário, que verificou um monte de checkboxs de seleção.

O seguinte adicionaria tags a uma postagem existente, sem primeiro buscar cada entidade de tag. Ele faz isso usando proxies de referência, gerados por EntityManager::getReference() :

 $tag_ids = $_POST['tag_id']; // an array of integers representing tag IDs. $post = $em->getRepository('Post')->find($post_id); // returns a Post entity. foreach($tags_ids as $tid){ $post->addTag($em->getReference('Tag',$tid)); } $em->persist($post); $em->flush(); 

No que diz respeito ao uso de um proxy de referência
Nas minhas investigações, isso é apenas parcialmente uma solução, da seguinte forma:

Sim, você não precisa recuperar pró-ativamente o registro relacionado (porque você cria um registro de proxy), mas quando você liberar (confirmar) a transação de atualização, ele ainda executa uma instrução selecionada para recuperar o registro relacionado e, em seguida, apenas faz a atualização (tudo em um hit para o db).
Isso é ineficiente e não deve ser necessário (temos o ID da chave estrangeira, por que recuperar o registro??)

Então, embora não seja uma solução completa, o que você ganha é apenas uma conexão única ao database (o que é bom) e um código ligeiramente simplificado.

Não tenho certeza se há uma solução para isso no momento … ??
Esperemos que a doctrine bods atualize no futuro e, se estiver usando a lógica proxy, devemos obter um aprimoramento automático do desempenho …

Você deve recuperar a entidade para estar relacionado e fazer a relação.

Eu suponho que você poderia especificar manualmente o relacionamento, acessando diretamente o database através da camada DBAL, mas eu não recomendaria isso, nem tentei.

Você pode fazer isso usando entityManager :: merge

 $post = new Post(); $post->setPostCategory(['id' => 1]); $em->persist($em->merge($post)); $em->flush();