Mysql
 sql >> Base de données >  >> RDS >> Mysql

Deux valeurs générées dans la doctrine

D'après ce que je sais, la stratégie GeneratedValue est réservée à la clé primaire, ce qui signifie que vous ne pouvez l'utiliser qu'une seule fois par entité.

Selon vos besoins, vous avez quelques options :

  • Vous pouvez toujours avoir un événement de cycle de vie prePersist , en définissant la valeur de votre choix pour le nom avant de le conserver la première fois.

  • Si vous dépendez de l'identifiant pour générer un autre identifiant unique à partir de celui-ci, vous pouvez implémenter un événement postPersist, y définir votre nom et vous assurer de vider deux fois (la première fois pour générer la clé primaire, la deuxième fois pour enregistrer le nom).

  • Si cela vous convient que le nom soit vide dans la base de données pendant un certain temps, il peut être acceptable d'implémenter un événement postLoad, qui remplit le nom s'il est vide. De cette façon, votre application voit toujours le nom (car il est soit chargé à partir de la base de données, soit rempli par l'événement postLoad) et lorsque vous ajoutez ou modifiez des informations pour la première fois après l'enregistrement initial, votre nom sera également enregistré

  • Il peut être acceptable de ne pas enregistrer le nom et de le faire générer par un cronjob/deamon/file d'attente afin que votre application n'ait pas à le gérer. La seule chose que vous auriez à faire est de vous assurer qu'un nom manquant ne gâche rien.

  • Peut-être serait-il acceptable de générer une clé qui ne dépend pas de la clé primaire et qui peut donc être générée par un gestionnaire d'événements global . Vous avez bien sûr l'inconvénient qu'un tel gestionnaire d'événements, parce qu'il est global, est appelé pour chaque objet que vous persistez, peu importe s'il s'agit de la bonne entité.

  • Dernier point, mais non des moindres, il peut être acceptable de se rabattre sur les procédures stockées/déclencheurs pour laisser la base de données gérer cela. De cette façon, vous n'avez pas à vous soucier de cela dans votre application. Mais attention, il peut y avoir des pièges sur le chemin (comme un développeur qui oublie cela car ce n'est pas dans le code mais dans la base de données !).

Il peut y avoir d'autres moyens. Ce que j'essayais de dire, c'est :n'utilisez pas la valeur générée pour les propriétés de clé non primaire !