php mysql symfony doctrine doctrine-orm

php - Dos valores generados en la doctrina



mysql symfony (1)

Me gustaría implementar un ID legible para el ser humano en mi Doctrine-Entity. Quiero mantener el DB-ID para trabajar y agregar algo como "PRE12-00005" (con Prefijo y Año, y comenzar en 0 cada nuevo año). Intenté agregar un generador de ID personalizado, pero parece que Doctrine no puede trabajar con dos valores generados en una entidad.

/** * @var integer * @ORM/Column(name="id", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="IDENTITY") */ protected $id; /** * @var string * @ORM/Column(name="name", type="string", length=25, unique=true) * @ORM/GeneratedValue(strategy="CUSTOM") * @ORM/CustomIdGenerator(class="NameGenerator") */ protected $name;

Doctrine siempre intenta guardar el valor de retorno de mi generador en el campo "id" y nulo en "nombre". ¿Hay otra forma de implementarlo?


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

Dependiendo de tus necesidades tienes algunas opciones aunque:

  • Siempre puede tener un evento de ciclo de vida antes del Listado , configurando el valor que desee para el nombre antes de persistirlo la primera vez.

  • Si depende de la ID para generar otra ID única a partir de ella, podría 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 para usted que el nombre esté vacío en la base de datos durante algún tiempo, podría estar bien implementar un evento postLoad, que rellena el nombre si está vacío. De esta manera, su aplicación siempre ve el nombre (ya sea que se carga desde la base de datos o se llena con el evento postLoad) y cuando agrega o edita información la primera vez después del guardado inicial, su nombre también se guardará

  • Podría estar bien no guardar el nombre y que se genere por algún cronjob / deamon / queue para que su aplicación no tenga que lidiar con eso. Lo único que deberías hacer es asegurarte de que un nombre faltante no arruine algo.

  • Tal vez podría estar bien generar una clave que no depende de la clave principal y, por lo tanto, puede ser generada por un controlador de eventos global . Por supuesto, tiene el inconveniente de que un controlador de eventos de este tipo, porque es global, recibe llamadas 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 tendrá que meterse con esto dentro de su aplicación. Pero cuidado, puede que haya problemas en el camino (como un desarrollador que se olvida de esto porque no está en el código sino en la base de datos).

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