Utilisation de plusieurs bases de données sous Symfony avec Doctrine

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

Vous travaillez avec symfony, votre projet fonctionne à merveille et vous avez pu apprécier la puissance de doctrine pour gérer votre base de données, mais, vous aimeriez pouvoir utiliser une deuxième base de données avec votre site pour une raison quelconque : voici comment faire.

Attention :

La mise à jours 1.4.6 vers 1.4.7 pose un problème puisque symfony n’utilise plus la connexion propre à chaque objet et se connecte tout le temps à la dernière connexion spécifiée dans databases.yml. Ce problème n’est toujours pas résolu dans la version 1.4.8. Un ticket est ouvert (http://trac.symfony-project.org/ticket/9096). Le patch fourni par l’auteur du ticket permet de continuer de travailler en attendant la cloture du ticket.

diff
/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Table.php

1036c1036
<         return Doctrine_Query::create($this->_conn, $class)
---
>         return Doctrine_Query::create(null, $class)

Actuellement votre fichier « config/database.yml » ressemble à ceci :

dev:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=host_dev;dbname=database_dev
      username: username
      password: password

prod:
  doctrine:
    class: sfDoctrineDatabase
      param:
        dsn: mysql:host=host_prod;dbname=database_prod
        username: username
        password: password

et votre fichier « config/doctrine/schema.yml » ressemble à cela :

[...]

Table_1:
  columns:
    column_1 : { ... }
    column_2 : { ... }

Table_2:
  columns:
    column_1 : { ... }
    column_2 : { ... }

[...]

Afin de pouvoir utiliser Symfony avec une deuxième base de données, il vous suffit d’en configurer une nouvelle dans le fichier « config/database.yml », comme vous l’avez fait pour la première :

dev:
  doctrine_database_1:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=host_dev_1;dbname=database_dev_1
      username: username
      password: password

  doctrine_database_2:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=host_dev_2;dbname=database_dev_2
      username: username
      password: password

prod:
  doctrine_database_1:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=host_prod_1;dbname=database_prod_1
      username: username
      password: password

  doctrine_database_2:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=host_prod_2;dbname=database_prod_2
      username: username
      password: password

Maintenant que ces modifications sont effectuées, il ne reste qu’à configurer votre « config/doctrine/schema.yml » pour qu’il prenne en compte votre nouveau « config/database.yml ». Voici ce que vous devriez obtenir :

[...]

Database_1_Table_1:
  connection: doctrine_database_1
  columns:
    column_1 : { ... }
    column_2 : { ... }

Database_1_Table_2:
  connection: doctrine_database_1
  columns:
    column_1 : { ... }
    column_2 : { ... }

[...]

Database_2_Table_1:
  connection: doctrine_database_2
  columns:
    column_1 : { ... }
    column_2 : { ... }

Database_2_Table_2:
  connection: doctrine_database_2
  columns:
    column_1 : { ... }
    column_2 : { ... }

[...]

Voilà, votre projet Symfony peut désormais fonctionner avec deux bases de données. Vous pouvez rajouter autant de bases de données que vous désirez en suivant la même procédure. Bon développement !

Remarques :

  • Vous n’êtes pas obligé de préfixer le nom de vos tables par le nom de votre base comme dans nos exemples, on vous indique juste qu’entre deux bases il faut éviter les doublons de noms de tables, sinon lors de la génération des tables, doctrine créera la table seulement dans la dernière base où elle apparaît, afin d’éviter toute ambiguïté dans les fichiers générés.
  • Si vous installez des plugins utilisant une base de données, vous pouvez soit modifier le fichier « schema.yml » de votre plugin en lui précisant à quelle base se connecter à l’aide de la directive « connection » – ce n’est pas la meilleure chose à faire (il faut refaire la manipulation à chaque mise à jour etc.).
    Ou alors, vous pouvez garder à l’esprit que sans précision de votre part, les tables sont créées dans la dernière configuration de base trouvée dans « config/database.yml ».
  • FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

    Une réflexion sur « Utilisation de plusieurs bases de données sous Symfony avec Doctrine »

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Time limit is exhausted. Please reload CAPTCHA.