Existe-t-il un moyen d'obtenir l'ID que la doctrine donnera à une entité, avant de la persister et de la vider?

1
Sergio González 25 janv. 2017 à 13:15

5 réponses

Meilleure réponse

À partir des Meilleures pratiques de doctrine:

Évitez les identifiants générés automatiquement

  • Vos opérations db se bloqueront mutuellement
  • Vous refusez les insertions groupées
  • Vous ne pouvez pas effectuer de transactions à demandes multiples
  • Votre objet n'est pas valide tant qu'il n'est pas enregistré
  • Votre objet ne fonctionne pas sans la base de données

Utilisez plutôt les UUID

public function __construct()
{
    $this->id = Uuid::uuid4();
}

* Doctrine prend également en charge Stratégie de génération UUID elle-même depuis la version 2.3.

10
Timurib 25 janv. 2017 à 12:00

Avant le rinçage, l'ID n'est même pas attribué. Et lors du rinçage, l'ID est défini en fonction de votre logique d'ID. Si c'est incrémentiel, vous pouvez lire l'ID de la dernière ligne pour la table spécifique, puis ajouter +1 avec cela, mais ce ne sera en aucun cas une bonne solution de contournement.

Cependant, (bien que votre question ne porte pas sur ceci) si vous devez utiliser l'ID d'une entité, et pour une raison étrange, vous ne pouvez pas suivre les suggestions ci-dessus, vous pouvez double flush (et ce n'est pas non plus une bonne pratique de toute façon , mais juste une solution de contournement).

Je veux dire, vider, puis setProperty (avec getID) et vider à nouveau. Par exemple, vous avez une entité Post avec la propriété Title. Et pour une raison (je ne sais pas pourquoi), vous souhaitez insérer l'ID avec le titre donné par l'utilisateur. Donc, dans ce cas, vous pouvez le faire comme suit (encore une fois, ce n'est pas une bonne pratique, et j'espère que quelqu'un montrera une meilleure façon ici):

$entityManager->flush();

$yourEntity->setText($yourEntity->getTitle() . 'with ID: ' . $yourEntity->getId());
$entityManager->persist($yourEntity);
$entityManager->flush();

Pourrait aider.

1
Rupok 2 avril 2020 à 20:42

Comme Thomasz le mentionne déjà, l'utilisation de la stratégie AUTO ne permet pas d'obtenir l'ID avant le rinçage. En fait, en utilisant la stratégie automatique, ce n'est pas la Doctrine qui donne à votre entité l'identifiant, c'est votre SGBD qui génère automatiquement l'identifiant. Pour accéder à l'identifiant avant le vidage, vous pouvez générer l'identifiant vous-même. Il est en fait recommandé de le faire, regardez cette vidéo avec les bonnes pratiques: https://www.youtube. com / watch? v = rzGeNYC3oz0

0
Rene Terstegen 25 janv. 2017 à 11:54

De mon point de vue, ce n'est pas possible. Pourquoi avez-vous besoin de cela ? Vous pouvez utiliser un identifiant alternatif appelé code que vous générez comme uniqid () et que vous pouvez utiliser avant de persister.

0
actarus 25 janv. 2017 à 10:20

Ce n'est pas possible lorsque votre entité est configurée pour avoir un identifiant généré avec la stratégie AUTO (doc). Dans cette stratégie, l'id est généré par la base de données en utilisant serial, auto_increment ou une fonction similaire en fonction de la base de données que vous utilisez. Fondamentalement, la base de données attribue un identifiant lors de l'exécution de INSERT.

Vous pouvez cependant utiliser autre stratégie que AUTO, comme par exemple générateur de séquence. Dans ce cas, vous pouvez connaître l'id avant le vidage mais vous devez mettre à jour l'entité avec cette valeur par vous-même (Doctrine ne fera aucune magie ici)

1
Tomasz Madeyski 25 janv. 2017 à 10:29