Mapeo de entidades con distintas bases de datos

En un proyecto que estoy trabajando, ocurre que existen entidades que representan tablas de distintas fuentes de datos (mySql, PostgreSQL, etc.) y si no se configuran distintas entities ocurre que al actualizar el schema de la BD mete nuevas tablas donde no toca y otras cosas relacionadas.

Esto se puede solucionar en Symfony, para que cada conjunto de entidades que pertenecen a distintas bases de datos se mapeen como toca de forma separada por bundles.

Antes de nada, debemos tener en cuenta de crear un bundle con las entidades de cada origen de datos por separado. Por ejemplo, AppBundle tendra las entidades de la BD de MySQL, y CountryBundle tendra las entidades de la BD de PostgreSQL, por ejemplo.

Para ello necesitamos configurar primero las conexiones de las BD en el config.yml:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
            my_sql:
                driver:   "%database_driver_mysql%"
                host:     "%database_host_mysql%"
                port:     "%database_port_mysql%"
                dbname:   "%database_name_mysql%"
                user:     "%database_user_mysql%"
                password: "%database_password_mysql%"
                charset:  UTF8
                password: "%database_password_moodle%"
                charset:  UTF8

Despues mas abajo necesitamos especificar los entity managers a que bundle pueden atacar:

orm:
    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            mappings:
                UserBundle:  ~
                AppBundle:  ~
                CoreBundle:  ~
        country:
            connection: my_sql
            mappings:
                CountryBundle:  ~

De esta forma, al usar los comandos de doctrine para el schema o cualquier uso con el entity manager podremos especificar que conexion queremos usar, por ejemplo:

> php app/console doctrine:schema:update –force (por defecto usa la default)

php app/console doctrine:schema:update –force –em=my_sql (usará la conexion de MySQL)

Si neccesitamos usarlo en un controlador o servicio podremos usarlo asi:

$this->em = $this->container->get('doctrine')->getManager('my_sql');
$this->repository = $this->em->getRepository('CountryBundle:Country');

De esa forma solo usará la base de datos o entity manager que le digamos.

Eso es todo.

Anuncios