Doctrine2 - Obtenir l'ID de l'entité avant de rincer
Est-il possible d'obtenir un ID de l'entité avant l'persistent/flush?
Je veux dire:
$entity = new PointData();
$form = $this->createForm(new PointDataType(), $entity);
Si j'essaie $entity->getId() à ce stade, il ne retourne rien.
Je peux le faire fonctionner par:
$em->persist($entity);
$em->flush();
(en supposant que $em = $this->getDoctrine()->getEntityManager();)
Comment puis-je y parvenir?
Lisez à propos de identifiant les stratégies de génération sur la documentation de Doctrine pages.
Merci Crozin. J'avais déjà lu des trucs de ce genre. Im ne cherche pas à obtenir la prochaine indexation automatique. Il serait un échec si 2 utilisateurs en disant que l'action simultanément.
Merci Crozin. J'avais déjà lu des trucs de ce genre. Im ne cherche pas à obtenir la prochaine indexation automatique. Il serait un échec si 2 utilisateurs en disant que l'action simultanément.
OriginalL'auteur Xavi | 2012-05-07
Vous devez vous connecter pour publier un commentaire.
Si vous voulez connaître l'ID d'une entité avant qu'elle a été conservée dans la base de données, alors évidemment on ne peut pas utiliser des identifiants générés. Vous aurez besoin de trouver un moyen de générer des identifiants uniques vous-même (peut-être une sorte de fonction de hachage peut produire unique-valeurs assez).
C'est rarement une bonne idée, cependant, de sorte que vous devez être prudent.
Je pense très attentivement sur le pourquoi j'ai besoin de connaître l'identifiant avant de rincer. La Doctrine est assez bonne à vous permettant de construire un graphe d'objets, et persistent/chasse tout à la fois. Il semble probable que vous avez quelque chose de laid dans votre architecture, vous êtes à essayer de contourner. Il pourrait être une bonne idée pour réviser avant d'aller en bas de la générées par l'application-id de l'itinéraire.
Peut-être que vous pourriez utiliser l'UUID pour cette tâche, car ils sont pratiquement unique (en.wikipedia.org/wiki/Universally_unique_identifier) et ils peuvent être générés à l'avance, à partir de PHP par exemple. Je ne les aime pas beaucoup, mais serait une bonne solution.
Absolument. Uuid sont un grand pour ce cas d'utilisation. Dans les années depuis que j'ai écrit cette réponse, j'ai commencé à préférant Uuid comme des identificateurs d'entités. github.com/ramsey/uuid est un bon bibliothèque de génération, et github.com/ramsey/uuid-doctrine fournit une doctrine type de mise en œuvre qui fonctionne bien.
OriginalL'auteur timdev
Vous pouvez utiliser le @PostPersist annotation. Une méthode annotée avec qui sera exécuté juste avant de le rincer et mettre fin à l'Id de l'entité est d'ores et déjà disponibles.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html
postPersist - Le postPersist événement se produit pour une entité à la suite de l'entité a été rendue permanente. Elle sera invoquée après la base de données des opérations d'insertion. Généré des valeurs de clé primaire sont disponibles dans la postPersist événement.
OriginalL'auteur Elier
vous pouvez utiliser un auto générer des ID pour obtenir une clé comme universellement identificateurs uniques (UUID) ou vous pouvez prendre les événements de symfony:
postFlush - Le postFlush événement se produit à la fin d'une opération de vidage.
OriginalL'auteur achref akrouti