Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Un bundle y entidades de diferentes bases de datos

26 de mayo de 2015

Saludos

Tengo una duda. Tengo una base de datos de solo lecura, de las cuales importe varias tablas (Relacionadas) necesarias para este caso, dentro de ExternoBundle.

Mi duda necesito crea una entidad dentro del Externobundle que tiene relacion con las entidades creadas con la base de datos de lectura.

doctrine:
    # ...
    orm:
        # ...
        entity_managers:
            default:
                connection: default
                mappings:
                    TestBundle: ~

            externo:
                connection: externo
                mappings:
                    ExternoBundle: ~

Esta nueva entidad se almacenara en la base de datos datos por defecto. El problema es que cada bundle está asociado a administrador de entidades y este a la vez una base de datos especifica, por tanto no puedo crear esta entidad dentro de este Externobundle, porque este está asociado con el entity manager externo.

Por lo tanto debo crearlo sobre TestBundle.


Respuestas

#1

Eso de "un solo entity manager por cada bundle" no es una limitación real de Doctrine+Symfony, sino algo que sucede cuando se aplica la configuración por defecto de Symfony.

En teoría, en el archivo config.yml de tu aplicación tendrías que decirle a Symfony qué entidades de Doctrine cargar y en qué entity manager hacerlo. Como el 99% de las aplicaciones quiere cargar todas las entidades en el único entity manager que existe, configurar todo esto a mano sería aburridísimo.

En tu caso sin embargo, la configuración por defecto no te sirve de nada, así que tiene que configurarlo a mano. Para ello, lo primero que te aconsejo es que crees subdirectorios dentro del direcotrio Entity/ para separar mejor los dos tipos de entidades:

src/Acme/ExternoBundle/Entity/BD1/Entidad1.php
src/Acme/ExternoBundle/Entity/BD1/Entidad2.php
src/Acme/ExternoBundle/Entity/BD2/Entidad3.php

Después, en la configuración de Doctrine sólo tienes que decirle qué entity manager maneja cada subdirectorio de entidades:

doctrine:
    # ...
    orm:
        # ...
        entity_managers:
            default:
                connection:       default
                mappings:
                    ExternoBundle:
                      type:     "annotation"
                      dir:      "Entity/BD1"
                      prefix:   "ExternoBundle\Entity\BD1"
            externo:
                connection:       externo
                mappings:
                    ExternoBundle:
                      type:     "annotation"
                      dir:      "Entity/BD2"
                      prefix:   "ExternoBundle\Entity\BD2"

@javiereguiluz

27 mayo 2015, 9:07
#2

Gracias @javiereguiluz,

consulta,

  1. type: es el tipo de mapeo de la entidad.
  2. prefix: Tengo una duda en este punto. el "prefix + dir" si ese es el caso el prefix deberia se asi: "Aplicacion\ExternoBundle" o esta bien como esta señalado.

  3. Se podria especificar una entity especifica.

Gracias, nuevamente.

@dariongg

27 mayo 2015, 14:14
#3

Ejecuté el comando doctrine:generate:entities sobre la base de datos de apoyo:

EnternoBundle/Entity/Default  // BD Principal
EnternoBundle/Entity/Externo // BD Apoyo
$ doctrine:generate:entities EnternoBundle:Externo/entity1

Me arroja un error que no está mapeada la entidad. Volviendo a la estructura por defecto si lo realiza.

@dariongg

28 mayo 2015, 13:46