2010-08-18 3 views
59

Wie kann ich die letzte einfügen ID mit Lehre 2 ORM bekommen? Ich habe das in der Dokumentation der Lehre nicht gefunden, ist das überhaupt möglich?Erhalten Sie die letzte Einfüge-ID mit Doktrin 2?

+0

versuchen Sie dies, am Ende Ihrer Einfügung geben Sie die ID zurück ... wie return $ this-> id; – Manie

Antwort

140

Ich hatte diese nach dem Flush zu verwenden, um den letzten Einsatz-ID zu erhalten:

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

Kann es nicht benutzen. Fehler erhalten Aufruf zu undefinierter Methode Test \ Entity \ Test :: getId() in "Mein Projekt" –

+0

@noobie-php Sie müssen einen öffentlichen Getter für Ihre ID definieren (wenn diese privat ist wie sie sein sollte) – cheesemacfly

+0

@cheesemacfly : Ich habe bereits sortiert, dass dieser Fehler generiert wird (in meinem Szenario) wenn wir aus irgendeinem Grund flush() nicht ausführen können, sobald Flush() erfolgreich ausgeführt wird, beginnt getID() zu arbeiten, vorausgesetzt, Getter und Setter sind kein Problem –

9

Aufruf flush() viele neuen Einheiten hinzufügen kann möglicherweise, so gibt es nicht wirklich die Vorstellung von „lastInsertId“. Doctrine füllt jedoch die Identitätsfelder immer dann auf, wenn eine generiert wird. Daher wird beim Zugriff auf das ID-Feld nach dem Aufruf von flush immer die ID einer neu "persistenten" Entität angezeigt.

29

Sie können auf die ID zugreifen, nachdem Sie die Persist-Methode des Entitätsmanagers aufgerufen haben.

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

Sie tun benötigen, um zu spülen diese ID zu bekommen.

Syntax Error Fix: Semikolon hinzugefügt, nachdem $ entityManager-> flush() aufgerufen wurde.

+6

Ich musste spülen, um den Wert zurück zu bekommen. Persistieren war nicht genug, da die Items erst dann in die Datenbank geschrieben werden, wenn Sie sie spülen. –

3

Ein bisschen spät, um die Frage zu beantworten. Aber

Wenn es eine MySQL-Datenbank

sollte $doctrine_record_object->id Arbeit, wenn AUTO_INCREMENT in der Datenbank definiert ist und in der Tabellendefinition.

17

Wenn Sie nicht Einheiten verwenden, aber Native SQL als here gezeigt dann könnten Sie die letzte Eingabe-ID erhalten möchten, wie unten dargestellt:

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

Bei Datenbanken mit Sequenzen wie PostgreSQL bitte nicht, dass Sie Geben Sie den Sequenznamen als ersten Parameter der Methode lastInsertId an.

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

Für weitere Informationen werfen Sie einen Blick auf den Code auf GitHub here und here.

+0

Dies funktioniert möglicherweise nicht mit jedem DBMS. Zum Beispiel funktioniert es nicht mit Postgres (wegen Sequenzen) –

+0

Super !! Ich habe stundenlang nach diesem kleinen Ausschnitt gesucht. – MikeGA

+4

@ paul.ago Sie müssen nur den Namen der Sequenz wissen, zB: 'lastInsertId ('articles_id_seq')' – ChocoDeveloper

Verwandte Themen