Live geek or die tryin'

Symfony2: Utiliser Plusieurs Bases De Données

Dans le cas où votre site développé avec Symfony2 utiliserait plusieurs bases de données, il faudra déclarer autant de connexions et d’Entity Managers que de bases de données.

Un Entity Manager est tout simplement une interface qui inter-réagi avec une base de donnée.

Pour illustrer mon exemple, je vais utiliser une bdd site et une autre forum.

Déclarer les connexions dans config.yml

doctrine:
  dbal:
    default_connection: site # précise la connexion utilisée par défaut
    connections:
      site:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   site
        user:     site_usr
        password: site_pwd
        charset:  UTF8
      forum:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   forum
        user:     forum_usr
        password: forum_pwd
        charset:  UTF8

Déclarer les EM, dans le même fichier

Tout d’abord désactivez l’auto-mapping, comme ça vous pourrez choisir quel EM va gérer les entités de quel bundle.

doctrine:
  orm:
    auto_mapping: false

Note: Si vous avez une erreur relative à cette ligne, supprimez-la carrément.

Ensuite, juste en bas, déclarez les EM en précisant les mappings avec chaque bundle.

doctrine:
  orm:
    auto_mapping: false
    default_entity_manager: web # précise l'em utilisé par défaut (lors de l'utilisation de la ligne de commande par exemple)
    entity_managers:
      web:
        connection: web
        mappings:
          DinduksMachinBundle : ~
          DinduksTrucBundle : ~
          FOSUserBundle: ~
      forum:
        connection: forum
        mappings:
          DinduksForumBundle : ~

Pour faire simple, les mappings font le lien entre un EM et les entités d’un bundle spéficique. C’est eux qui appellent, si j’ose dire, l’EM X quand on veut manipuler l’entité Y.

Attention: N’oubliez pas de toujours mapper vos bundles fraîchement créés avec un EM, sinon vous aurez un erreur de bundle inexistant lors de l’utilisation de la commande doctrine:generate:entities.

Utilisation

De la même manière que vous appelez votre EM par défaut, appelez l’EM dont vous avez besoin en prenant soin de passer son nom en paramètres à la fonction getEntityManager().

$forumEm = $this->get('doctrine')->getEntityManager('forum');

J’espère que ce tutoriel vous sera utile. A bientôt. :)

Comments