Wie kann ich die letzte Insert-ID mit Doktrin 2 ORM abrufen? Ich habe das nicht in der Doktrin gefunden, ist das überhaupt möglich?
Holen Sie sich die letzte Insert-ID mit Doktrin 2?
Ich musste dies nach dem Flush verwenden, um die letzte Insert-ID zu erhalten:
$em->persist($user);
$em->flush();
$user->getId();
-
Kann es nicht benutzen. Fehler erhalten Aufruf der undefinierten Methode Test\Entity\Test::getId() in “Mein Projekt”
– noobie-php
19. Juni 2013 um 19:40 Uhr
-
@noobie-php Sie müssen einen öffentlichen Getter für Ihre ID definieren (wenn dieser privat ist, wie er sein sollte)
– Käsemaus
19. August 2013 um 17:04 Uhr
-
@cheesemacfly: Ich habe das bereits aussortiert. Dieser Fehler wird generiert (in meinem Szenario), wenn wir aus irgendeinem Grund nicht to flush() können, sobald Flush() erfolgreich ausgeführt wird, beginnt getID() zu arbeiten, vorausgesetzt, Getter und Setter sind kein Problem hier
– noobie-php
20. August 2013 um 16:39 Uhr
-
Was wenn ich
persist()
die Entität in einer Schleife undflush()
danach? Ich versuche, das herauszufinden, aber bisher kein Glück.– Nat Naydenova
17. Dezember 2015 um 16:04 Uhr
-
ID der Variablen zuweisen:
code
$id = $user->getId();code
– Josia
14. Juli 2017 um 10:22 Uhr
Clarkstachio
Sie können auf die ID zugreifen, nachdem Sie die persist- und flush-Methoden des Entity-Managers aufgerufen haben.
$widgetEntity = new WidgetEntity();
$entityManager->persist($widgetEntity);
$entityManager->flush();
$widgetEntity->getId();
Du muss rufen Sie Flush auf, um diese ID zu erhalten.
Francesco Casula
Wenn Sie wie gezeigt keine Entitäten, sondern Native SQL verwenden hier dann möchten Sie vielleicht die zuletzt eingefügte ID wie unten gezeigt erhalten:
$entityManager->getConnection()->lastInsertId()
Für Datenbanken mit Sequenzen wie z PostgreSQL Bitte beachten Sie, dass Sie den Sequenznamen als ersten Parameter der angeben können lastInsertId
Methode.
$entityManager->getConnection()->lastInsertId($seqName="my_sequence")
Weitere Informationen finden Sie im Code auf GitHub hier und hier.
-
Dies funktioniert möglicherweise nicht mit jedem DBMS. Zum Beispiel funktioniert es nicht mit Postgres (wegen Sequenzen)
– paul.ago
1. Februar 2015 um 18:34 Uhr
-
Genial!! Ich habe Stunden damit verbracht, nach diesem kleinen Ausschnitt zu suchen.
– MikeGA
22. April 2015 um 21:33 Uhr
-
@paul.ago Sie müssen nur den Namen der Sequenz kennen, zB:
lastInsertId('articles_id_seq')
– ChocoDeveloper
24. April 2015 um 16:33 Uhr
-
Sie können den Namen der Sequenz auch so erhalten:
$conn = $this->getDoctrine()->getConnection();
$metadata = $em->getClassMetadata('\App\Entity\YourClass');
$seqName = $metadata->getSequenceName($conn->getDatabasePlatform());
Funktioniert 🙂– Hugues D
15. Oktober 2019 um 20:35 Uhr
Das Aufrufen von flush() kann möglicherweise viele neue Entitäten hinzufügen, daher gibt es nicht wirklich den Begriff “lastInsertId”. Doctrine füllt die Identitätsfelder jedoch immer dann aus, wenn eines generiert wird, sodass der Zugriff auf das ID-Feld nach dem Aufruf von Flush immer die ID einer neu “bestandenen” Entität enthält.
Purasapa
Etwas spät um die Frage zu beantworten. Aber,
Wenn es sich um eine MySQL-Datenbank handelt
sollte $doctrine_record_object->id
arbeiten, wenn AUTO_INCREMENT
ist in der Datenbank und in Ihrer Tabellendefinition definiert.
In meinem Fall habe ich, als ich $id als privat deklariert habe, gerade eine neue öffentliche Methode erstellt, um sie abzurufen.
public function getId() {
return $this->id;
}
Also dann könnte ich es so nennen
$user = new User();
$user->setUsername("Kylo Ren");
$entityManager = getEntityManager();
$entityManager->persist($user);
$entityManager->flush();
echo "Created User with ID " . $user->getId() . "\n";
Techappri
Hier poste ich meinen Code, nachdem ich mich einen Arbeitstag gedrängt habe, um diese Lösung zu finden.
Funktion zum Abrufen des letzten gespeicherten Datensatzes:
private function getLastId($query) {
$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare($query);
$stmt->execute();
$lastId = $stmt->fetch()['id'];
return $lastId;
}
Eine andere 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;
}
Versuchen Sie dies, geben Sie am Ende Ihrer Einfügung die ID zurück … wie return $this->id;
– Manie
18. August 2010 um 6:13 Uhr