Holen Sie sich die letzte Insert-ID mit Doktrin 2?

Lesezeit: 3 Minuten

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?

  • 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


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 und flush() 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

Benutzer-Avatar
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.

Benutzer-Avatar
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.

Benutzer-Avatar
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";

Benutzer-Avatar
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;
    }

1351910cookie-checkHolen Sie sich die letzte Insert-ID mit Doktrin 2?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy