87 votes

Obtenez le dernier ID inséré avec Doctrine 2 ?

Comment puis-je obtenir le dernier id inséré avec Doctrine 2 ORM? Je n'ai pas trouvé cela dans la documentation de Doctrine, est-ce même possible?

0 votes

Essaie ceci, à la fin de ton insertion retourne l'id... comme retourner $this->id;

187voto

tom Points 2384

J'ai dû utiliser cela après le vidage pour obtenir le dernier id inséré :

$em->persist($user);
$em->flush();
$user->getId();

2 votes

Impossible de l'utiliser. Erreur d'appel à la méthode non définie Test\Entity\Test::getId() dans "Mon Projet"

0 votes

@noobie-php Vous devez définir une méthode publique getter pour votre Id (si celui-ci est privé comme il se doit)

0 votes

@cheesemacfly : J'ai déjà trié cela cette erreur est générée (dans mon scénario) quand nous ne pouvons pas flush() pour une raison quelconque, une fois Flush() est exécuté avec succès getID() commence à fonctionner, en supposant que les getters et setters ne sont pas un problème ici

46voto

clarkstachio Points 198

Vous pouvez accéder à l'identifiant après avoir appelé les méthodes persist et flush du gestionnaire d'entités.

$widgetEntity = new WidgetEntity();
$entityManager->persist($widgetEntity);
$entityManager->flush();
$widgetEntity->getId();

Vous devez appeler flush pour obtenir cet identifiant.

35voto

Francesco Casula Points 2508

Si vous n'utilisez pas d'entités mais du SQL natif comme indiqué ici, alors vous voudrez peut-être obtenir l'identifiant inséré en dernier comme indiqué ci-dessous :

$entityManager->getConnection()->lastInsertId()

Pour les bases de données avec des séquences telles que PostgreSQL, veuillez noter que vous pouvez fournir le nom de la séquence en tant que premier paramètre de la méthode lastInsertId.

$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence')

Pour plus d'informations, consultez le code sur GitHub ici et ici.

10voto

beberlei Points 2645

Appeler flush() peut potentiellement ajouter beaucoup de nouvelles entités, donc il n'y a pas vraiment la notion de "lastInsertId". Cependant, Doctrine remplira les champs d'identité chaque fois que l'un sera généré, donc en accédant au champ id après avoir appelé flush contiendra toujours l'ID d'une entité nouvellement "persistante".

2voto

Purasapa Points 21

Un peu en retard pour répondre à la question. Mais,

Si c'est une base de données MySQL

devrait $doctrine_record_object->id fonctionner si AUTO_INCREMENT est défini dans la base de données et dans la définition de votre table.

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