2010-08-18 4 views

Répondre

140

je devais utiliser ceci après la chasse d'eau pour obtenir le dernier id insérer:

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

Je ne peux pas l'utiliser. Obtenir l'erreur Appel à la méthode indéfinie Test \ Entity \ Test :: getId() dans "Mon Projet" –

+0

@ noobie-php Vous devez définir un getter public pour votre Id (si celui-ci est privé comme il se doit) – cheesemacfly

+0

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

9

appel flush() peut potentiellement ajouter beaucoup de nouvelles entités, donc il ny a pas vraiment la notion de « lastInsertId ». Cependant, Doctrine remplira les champs d'identité à chaque génération, de sorte que l'accès au champ id après avoir appelé flush contiendra toujours l'ID d'une entité nouvellement "persistée".

29

Vous pouvez accéder à l'ID après avoir appelé la méthode persist du gestionnaire d'entités.

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

Vous avez besoin de rincer afin d'obtenir cet ID. Syntaxe Error Fix: Ajout du point-virgule après l'appel de $ entityManager-> flush().

+6

J'ai dû rincer pour récupérer la valeur. La persistance n'était pas suffisante, car les éléments ne sont pas réellement écrits dans la base de données tant que vous n'avez pas vidé. –

3

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

Si c'est une base de données MySQL

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

17

Si vous n'êtes pas en utilisant des entités mais SQL natif comme indiqué here alors vous pouvez obtenir le dernier ID inséré comme indiqué ci-dessous:

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

Pour les bases de données avec des séquences telles que PostgreSQL s'il vous plaît pas que vous pouvez fournissez 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 un coup d'oeil au code sur GitHub here et here.

+0

Cela peut ne pas fonctionner avec tous les SGBD. Par exemple, cela ne fonctionne pas avec Postgres (à cause des séquences) –

+0

Génial !! J'ai passé des heures à chercher ce petit extrait. – MikeGA

+4

@ paul.ago Vous avez juste besoin de connaître le nom de la séquence, par exemple: 'lastInsertId ('articles_id_seq')' – ChocoDeveloper

Questions connexes