sql >> Base de Datos >  >> RDS >> Mysql

Dos valores generados en Doctrine

Por lo que sé, la estrategia GeneratedValue está reservada para la clave principal, lo que significa que solo puede usarla una vez por Entidad.

Sin embargo, dependiendo de sus necesidades, tiene algunas opciones:

  • Siempre puedes tener un evento de ciclo de vida prePersist , estableciendo cualquier valor que desee para el nombre antes de conservarlo por primera vez.

  • Si depende de la identificación para generar otra identificación única a partir de ella, puede implementar un evento postPersist, establecer su nombre allí y asegurarse de vaciar dos veces (la primera vez para generar la clave principal, la segunda vez para guardar el nombre).

  • Si está bien que el nombre esté vacío en la base de datos durante algún tiempo, podría estar bien implementar un evento postLoad, que llena el nombre si está vacío. De esta manera, su aplicación siempre ve el nombre (porque se carga desde la base de datos o se completa con el evento postLoad) y cuando agrega o edita información por primera vez después de guardar por primera vez, su nombre también se guardará

  • Podría estar bien no guardar el nombre y hacer que algún cronjob/deamon/queue lo genere para que su aplicación no tenga que lidiar con eso. Lo único que debe hacer es asegurarse de que la falta de un nombre no arruine nada.

  • Tal vez esté bien generar una clave que no dependa de la clave principal y, por lo tanto, pueda ser generada por un controlador de eventos globales . Por supuesto, tiene el inconveniente de que dicho controlador de eventos, debido a que es global, recibe una llamada para cada objeto que persiste, sin importar si es la entidad correcta.

  • Por último, pero no menos importante, podría estar bien recurrir a Procedimientos almacenados/Desencadenadores para permitir que la base de datos maneje esto. De esta manera, no tiene que meterse con esto dentro de su aplicación. Pero cuidado, puede haber obstáculos en el camino (¡como que un desarrollador se olvide de esto porque no está en el código sino en la base de datos!).

Puede haber otras formas. Lo que estaba tratando de decir es:¡No use el valor generado para propiedades de clave no primaria!