49 votes

Doctrine2 Insertion et récupération d'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 alors obtenir le dernier ID de l'utilisateur que je viens d'insérer ? S'il n'est pas possible de le faire, alors comment générer un ID pour pouvoir faire ce qui suit :

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

122voto

Flask Points 3333

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

10voto

Nikola Petkanski Points 1197

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

Il peut être utilisé avec des requêtes natives ainsi que 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 à partir du gestionnaire d'entités :

$connection = $em->getConnection();

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

1voto

Layke Points 10216

A condition que l'Entité que vous essayez de mettre en place ait

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

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

Il y a cependant quelques réserves, comme le fait que vous ne pouvez pas le faire avec des clés composées, et que vous devez évidemment vider toutes les entités. Ainsi, si vous détachez une Entité qui a une association avec l'entité persistée dont vous essayez d'obtenir l'ID, vous ne pourrez pas récupérer l'ID.

A part ça, la réponse de Flask est parfaite.

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

0voto

Bramus Points 85

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X