ZF2 + Doctrine 2 – Discriminadores a nivel de niño con herencia de tabla de clase

3 minutos de lectura

Mucho de lo que se pregunta en SO y en la web con respecto a ZF2 con Doctrine 2 y el uso de Discriminadores es: ¿cómo no se declaran todas las Entidades secundarias en la Entidad principal? ¿Especialmente cuando tienes múltiples módulos?

La respuesta corta es: no declarar un discriminatorMap. Doctrine lo manejará por ti.

La respuesta más larga está abajo.

ZF2 + Doctrine 2 - Discriminadores a nivel de niño con herencia de tabla de clase
mercado

Un artículo popular sobre cómo poder declarar sus Entidades secundarias, en las Entidades secundarias, en lugar de las principales, es este.

Sin embargo, Doctrine 2 ha cambiado un poco desde que fue escrito, por ejemplo, el AnnotationWriter ya no existe.

Sin embargo, hay una forma más simple, como mencioné en la pregunta: no hacer nada.

Para usar ahora los Discriminadores usando el “Herencia de tabla de clases” (a diferencia de la “herencia de tabla única”) es ¡NO DECLARAR un mapa discriminador! (No estoy seguro si esto también funcionará para STI…)

Encontré un boleto viejo en Github eso explica el mismo problema que esta respuesta y que muchas personas todavía tienen, que declarar sobre el padre no tiene sentido. Después de leer eso, me sumergí en el código y volví a leer los documentos, con cuidado.

Además, si tiene mucho cuidado al leer los documentos, dice que esto es posible, al no decirlo.

Citando:

Cosas a tener en cuenta:

@InheritanceType, @DiscriminatorColumn y @DiscriminatorMap deben especificarse en la clase superior que es parte de la jerarquía de entidades mapeadas.

El @DiscriminatorMap especifica qué valores de la columna discriminadora identifican una fila de qué tipo. En el caso anterior, un valor de “persona” identifica una fila como de tipo Persona y “empleado” identifica una fila como de tipo Empleado.

Los nombres de las clases en el mapa discriminador no necesitan estar completamente calificados si las clases están contenidas en el mismo espacio de nombres que la clase de entidad en la que se aplica el mapa discriminador.

Si no se proporciona un mapa discriminador, el mapa se genera automáticamente. El mapa discriminador generado automáticamente contiene el nombre abreviado en minúsculas de cada clase como clave.

Por supuesto, la documentación anterior establece explícitamente que un mapa se generaría si no se proporcionó ninguno. A través de contradice la primera cosa a tener en cuenta, que es que el @DiscriminatorMap debe proporcionarse en la clase más alta de la jerarquía.

Entonces, si tuviera que extender sus clases a través de varios módulos (ya que supongo que es por eso que estaría leyendo esto), ¡no declare un mapa discriminador!

Os dejo con un ejemplo a continuación:

<?php
namespace MyNamespaceEntity;

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * // NOTE: No @DiscriminatorMap!!!
 */
class Person
{
    // ...
}


<?php
namespace MyOtherNamespaceEntity;

/** @Entity */
class Employee extends MyNamespaceEntityPerson
{
    // ...
}

Cuando use el comando de la CLI de la doctrina para verificar sus entidades, encontrará que esto es correcto.

Además, verifique que funcione completamente usando el comando de verificación de entidades:

./vendor/bin/doctrine-module orm:mapping:describe “MyNamespaceEntityPerson”

Cerca de la parte superior de la respuesta de ese comando estará esta línea:

| Discriminator map | {“person”:”My\Namespace\Entity\Person”,”employee”:”My\Other\Namespace\Entity\Employee”}

.

¿Ha sido útil esta solución?