Wie kann ich die letzte Insert-ID mit Doctrine 2 ORM erhalten? Ich habe das nicht in der Dokumentation der Lehre gefunden, ist das überhaupt möglich?
php
orm
doctrine
lastinsertid
Tom
quelle
quelle
Antworten:
Ich musste dies nach dem Flush verwenden, um die letzte Insert-ID zu erhalten:
quelle
persist()
die Entität in einer Schleife undflush()
danach? Ich versuche das herauszufinden, aber bisher kein Glück.code
Weisen Sie der Variablen eine ID zu: $ id = $ user-> getId ();code
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 , um zu spülen müssen diese ID zu bekommen.
Syntaxfehlerbehebung: Semikolon hinzugefügt, nachdem $ entityManager-> flush () aufgerufen wurde.
quelle
Wenn Sie keine Entitäten verwenden, sondern Native SQL, wie hier gezeigt , möchten Sie möglicherweise die zuletzt eingefügte ID wie unten gezeigt erhalten:
Bei Datenbanken mit Sequenzen wie PostgreSQL beachten Sie bitte, dass Sie den Sequenznamen als ersten Parameter der
lastInsertId
Methode angeben können.$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence')
Weitere Informationen finden Sie hier und hier im Code auf GitHub .
quelle
lastInsertId('articles_id_seq')
$conn = $this->getDoctrine()->getConnection();
$metadata = $em->getClassMetadata('\App\Entity\YourClass');
$seqName = $metadata->getSequenceName($conn->getDatabasePlatform());
Works :-)Das Aufrufen von flush () kann möglicherweise viele neue Entitäten hinzufügen, sodass der Begriff "lastInsertId" nicht wirklich verwendet wird. Doctrine füllt jedoch die Identitätsfelder immer dann aus, wenn eines generiert wird. Daher enthält der Zugriff auf das ID-Feld nach dem Aufruf von flush immer die ID einer neu "persistierten" Entität.
quelle
Ein bisschen spät, um die Frage zu beantworten. Aber,
Wenn es sich um eine MySQL-Datenbank handelt
sollte
$doctrine_record_object->id
funktionieren, wennAUTO_INCREMENT
in der Datenbank und in Ihrer Tabellendefinition definiert ist.quelle
Hier poste ich meinen Code, nachdem ich mich einen Arbeitstag lang bemüht habe, diese Lösung zu finden.
Funktion zum Abrufen des zuletzt gespeicherten Datensatzes:
private function getLastId($query) { $conn = $this->getDoctrine()->getConnection(); $stmt = $conn->prepare($query); $stmt->execute(); $lastId = $stmt->fetch()['id']; return $lastId; }
Eine weitere Funktion, die die obige Funktion aufruft
private function clientNum() { $lastId = $this->getLastId("SELECT id FROM client ORDER BY id DESC LIMIT 1"); $noClient = 'C' . sprintf("%06d", $lastId + 1); // C000002 if the last record ID is 1 return $noClient; }
quelle
Einfacher:
SELECT max(id) FROM client
quelle