symfony2 - symfony 4 database config
Cómo Symfony y Doctrine obtienen asociaciones y entidades relacionadas (2)
Sacudí mi cabeza tratando de darme cuenta de cómo Symfony y Doctrine captan las entidades asociadas.
Imaginemos: tengo varias entidades asociadas:
- Compañía (ManyToOne a la ciudad)
- Ciudad (ManyToOne a la región, OneToMany a la compañía)
- Región (ManyToOne to Country, OneToMany to City)
- País (OneToMany a la Región)
Cuando presento el formulario de la empresa, creo un oyente de evento de formulario (en PRE_SET_DATA) que inserta las casillas de selección de país y región en este formulario. Los valores en estos campos se deben establecer según la Región asociada.
Recupero la actual Región de la Compañía a través de:
$company = $event->getData();
$city = $company->getCity()
Eso funciona bien
Pero cuando intento esto:
$region = $city->getRegion(); // returns NULL
$country = $region->getCountry(); // returns NULL
estos métodos devuelven NULL. Pero, de hecho, todas las asociaciones existen y el mapeo de asociaciones Doctrine es correcto. ¿Por qué?
De acuerdo con la documentación de Doctrine: cuando llamo a getter para el objeto proxy (estos objetos son proxies, ¿no?) - Doctrine debería obtener datos insuficientes de la base de datos y actualizar el objeto. De hecho, los métodos devuelven NULLs.
¿Cómo puedo obtener cualquier entidad asociada? (desde cualquier nivel de asociación profunda)
Solo necesitaba eliminar el directorio de caché ...
deberías tratar de obtenerlo de tu controlador en lugar de la clase de formulario
- $ em = $ this-> getDoctrine () -> getManager ();
- $ em-> initializeObject ($ obj); // esto inicializará el objeto que necesita y recuperará el real de la base de datos y no la clase proxy que devuelve Doctrine.
Está devolviendo NULL porque tiene demasiados niveles company -> (1) city -> (2) region y la doctrina se pierde con la clase proxy. si esto no funciona, intente hacer una consulta DLQ cuando tenga la ciudad.
si quieres entender cómo una clase proxy se parece a dump ($ company); y verá que solo muestra la identificación de la ciudad.