38 votes

Lors de l'insertion d'une entité avec des associations, existe-t-il un moyen d'utiliser simplement le FK au lieu de récupérer l'entité ?

J'ai besoin d'insérer une entité qui a des associations.

Si j'ai déjà les FK des entités associées, y a-t-il un moyen d'insérer l'entité primaire dans la base de données avec seulement les FK remplis ?

Ou est-ce que je dois toujours

  • récupérer les entités associées via les FK,
  • remplir les propriétés de l'entité primaire en se référant aux assocations,
  • et ensuite invoquer la méthode persist.

65voto

timdev Points 25910

Vous voulez un mandataire de référence

Disons que j'ai des articles et des étiquettes. Un article a plusieurs étiquettes. Je reçois une série d'étiquettes de l'utilisateur, qui a coché une série de cases à cocher.

L'exemple suivant permet d'ajouter des balises à un article existant, sans avoir à récupérer au préalable chaque entité de balises. Pour ce faire, elle utilise des proxies de référence, générés par la commande 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();

4voto

MarkOfSine Points 145

En ce qui concerne l'utilisation d'un mandataire de référence
D'après mes investigations, cette solution n'est que partiellement satisfaisante, comme suit :

Oui, vous n'avez pas besoin de récupérer de manière proactive l'enregistrement lié (parce que vous créez un enregistrement proxy), mais lorsque vous videz (validez) la transaction de mise à jour, elle exécute toujours d'abord une instruction de sélection pour récupérer l'enregistrement lié, puis effectue uniquement la mise à jour (en une seule fois dans la base de données).
Cette opération est inefficace et ne devrait pas être nécessaire (nous avons l'identifiant de la clé étrangère, pourquoi récupérer l'enregistrement ?)

Ainsi, bien qu'il ne s'agisse pas d'une solution complète, vous bénéficiez d'une seule connexion à la base de données (ce qui est bien) et d'un code légèrement simplifié.

Je ne suis pas sûr qu'il existe une solution à ce problème pour le moment... ?
Espérons que les corps de doctrine mettront à jour dans le futur et si nous utilisons la logique du proxy, nous devrions bénéficier d'une amélioration automatique des performances...

0voto

Cobby Points 2396

Vous devez récupérer l'entité à mettre en relation et établir la relation.

Je suppose que vous pourrait spécifier manuellement la relation en accédant directement à la base de données via la couche DBAL, mais je ne le recommande pas et je ne l'ai pas essayé.

-1voto

Fábio Paiva Points 157

Vous pouvez le faire en utilisant entityManager::merge

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X