web-dev-qa-db-fra.com

Doctrine2 Insérer et récupérer un nouvel ID d'insertion

Dans Doctrine2 en utilisant quelque chose comme:

$user = array('username' => 'example', 'passsword' => 'changeme');

$conn->insert('users', $user);

Comment puis-je obtenir le dernier ID de l'utilisateur que je viens d'insérer? S'il n'est pas possible de le faire, comment générer un identifiant pour pouvoir effectuer les opérations suivantes:

$id = //something here.
$user = array('username' => 'example', 'passsword' => 'changeme', 'id' => $id);
$conn->insert('users', $user);
46
NimmoNet

Si vous utilisez l'ORM

$em->persist($object);
$em->flush();
$object->getId();

si vous utilisez le DBAL:

$conn->lastInsertId();

http://www.doctrine-project.org/api/dbal/2.5/class-Doctrine.DBAL.Connection.html#_lastInsertId

112
Flask

On peut utiliser la méthode Doctrine\DBAL\Connection::lastInsertId().

Il peut être utilisé avec des requêtes natives ainsi qu'avec des insertions écrites manuellement.

Exemple de cas:

$query = 'INSERT INTO blabla...';
$connection->executeUpdate($query, $params);

var_dump($connection->lastInsertId());

Si vous utilisez l'ORM, vous pouvez obtenir une instance de la connexion auprès du gestionnaire d'entités:

$connection = $em->getConnection();

Remarque:
Mis à part les détails techniques, je suis d'accord avec @Layke pour l'utilisation d'une entité pour votre cas spécifique.

6
Nikola Petkanski

À condition que votre entité que vous essayez de définir ait

   /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

Ensuite, lorsque vous persistez votre objet, le gestionnaire d'entités remplit l'entité que vous essayez de conserver avec l'ID.

Cependant, certaines mises en garde sont que vous ne pouvez pas le faire avec des clés composites, bien sûr, et vous devez évidemment vider toutes les entités. Donc, si vous détachez une entité qui a une association avec l'entité persistante pour laquelle vous essayez d'obtenir l'ID, vous ne pourrez pas récupérer l'ID.

Mis à part la réponse de Flask, c'est bon.

$em->persist($object);
$em->flush();
$object->getId();
1
Layke

$conn->lastInsertId(); vous obtiendrez le dernier ID inséré lorsque vous utilisez uniquement le DBAL de Doctrine (sans ORM).

0
Bramus