Trabajar con múltiples bases de datos en Symfony

imagen ordenador
Solucionex
15
Dic 23

Viene de la documentación de Symfony

Si en nuestro proyecto necesitamos gestionar varias conexiones a bases de datos, bien sea porque tenemos diferentes entidades en diferentes bases de datos, o bien porque tenemos las mismas entidades en varias bases de datos podemos configurar nuestra aplicación para usar varias conexiones

doctrine:
   dbal:
       connections:
           default:
               url: '%env(resolve:DATABASE_URL)%'
           customer:
               url: '%env(resolve:CUSTOMER_DATABASE_URL)%'
       default_connection: default
   orm:
       default_entity_manager: default
       entity_managers:
           default:
               connection: default
               mappings:
                   Main:
                       is_bundle: false
                       dir: '%kernel.project_dir%/src/Entity/Main'
                       prefix: 'App\Entity\Main'
                       alias: Main
           customer:
               connection: customer
               mappings:
                   Customer:
                       is_bundle: false
                       dir: '%kernel.project_dir%/src/Entity/Customer'
                       prefix: 'App\Entity\Customer'
                       alias: Customer

En este ejmplo que viene de la documentación de Symfony podemos ver como configurar dos conexiones distintas (default y customer) y sus entity managers asociados, cada uno con un mapeo de entidades diferentes (se puede usar el mismo mapeo de entidades).

Hay que tener en cuenta que cuando configuramos nuestra aplicacion hay que hacer una serie de ajustes

  • A la hora de utilizar comandos de base de datos hay que indicar la conexion que queremos usar usando los parámetros --connection o --em
  • Cuando queremos obtener un entitymanager hay que tener en cuenta que podemos inyectarlo utilizando el nombre del entity manager que hemos definido, con la configuración anterior si inyectamos `EntityManagerInterface $customerEntityManager` obtedríamos el entityManger customer. En caso de que no supieramos de antemano que entity_manager se va a usar podremos obtenerlos a partir del ManagerRegistry de Doctrine, siguiendo con el ejemplo anterior $customerEntityManager = $managerRegistry->getManager('customer') habría que hacer lo mismo si solo queremos obtener un repositorio ` $customersRepository = $managerRegistry->getRepository(Customer::class, 'customer');`
  • Si una entidad puede ser gestionada por varios entity managers distintos puede dar lugar a comportamientos inesperados cuando creamos repositorios que extienden ServiceEntityRepository, en ese caso nuestros repositorios tienen que extender de EntityRepository y no ser inyectados
symfony