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?
Antworten:
Ich musste dies nach dem Flush verwenden, um die letzte Insert-ID zu erhalten:
$em->persist($user);
$em->flush();
$user->getId();
persist()
die Entität in einer Schleife und flush()
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.
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:
$entityManager->getConnection()->lastInsertId()
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 .
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.
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;
}
Einfacher: SELECT max(id) FROM client