Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-06-2013 13:23:10

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

[DBAL] Drivers multiple, database multiple

Bonjour,

Je rencontre un problème pour la définition de mes connections, sous MySQL/PostgreSQL, mes jointures multibases et l'utilisation des fonctions de DBAL. Je vous sollicite pour valider ma façon de faire dans ce contexte.

A l'ouverture de mon application, l'utilisateur procède à son installation (base de données). Il choisit soit MySQL soit PostgreSQL, ce qui donne les fichiers de configuration suivant:

Fichier de configuration doctrine DBAL: MySQL

Code:

...
params' => 
        array (
          'dbname' => 'kern',
          'host' => 'localhost',
          'port' => '3306',
          'user' => 'admin',
          'password' => '123456',
          'charset' => 'utf-8'
       )
...

Fichier de configuration doctrine DBAL: PostgreSQL

Code:

...
params' => 
        array (
          'dbname' => 'postgres', 
          'schema' => 'kern',
          'host' => 'localhost',
          'port' => '5432',
          'user' => 'postgres',
          'password' => '123456',
          'charset' => 'utf-8'
       )
...

Vous pouvez voir que j'ai rajouté dans mon tableau de params sous PostgreSQL, un paramètre "schema"

Sous MySQL, la notion de schema n'étant pas implémenté comme dans PostgreSQL, ma base de données principale sous MySQL correspondra au paramètre dbname tandis que sur PostgreSQL elle sera définit via le paramètre schema car je n'utilise pas le schéma par défaut "public"

Dans l'application, pour des raisons de performance et d'un point de vue fonctionnel, l'utilisateur peut créer des bases de données à la volée.

Quand celui-ci est connecté à une des "bases de données créées à la volée", et souhaite accéder à ses fonctionnalités, des requêtes avec jointure qui lie la base principale avec la base créée à la volée sont exécutés tel que :

Code:

$query  = "SELECT DISTINCT macro_rubrique_enveloppe.code_macro_rubrique, ";
$query .= "                            macro_rubrique.libelle_macro_rubrique ";
$query .= "FROM {$this->bdd2}.macro_rubrique_enveloppe ";
$query .= "INNER JOIN {$this->bdd1}.macro_rubrique
$query .= "ON macro_rubrique_enveloppe.code_macro_rubrique = macro_rubrique.code_macro_rubrique ";
$query .= "WHERE  macro_rubrique_enveloppe.millesime = {$millesime} ";
$query .= "AND  macro_rubrique.millesime = {$millesime} ";

$stmt = $this->connection->prepare($query);
$stmt->execute()
;

{$this->bdd1} => correspond à ma base de données principale
{$this->bdd2} => correspond à ma base de données créée à la volée.

A travers mes factories, je construis tous mes services tel que:

Code:

    public function __construct(Connection $connection, $mainSchema, $secondSchema)
    {
        $this->connection = $connection; // la connection DBAL
        $this->bdd1= $mainSchema; // La bdd principale qui correspond à "dbname" dans le fichier de config.
        $this->bdd2= $secondSchema; // la bdd créée à la volée
    }

Je rencontre des soucis d'utilisation des fonctions de DBAL, tel que pour la création de clé étrangère:

Code:

 
    public function installFk()
    {
        $schemaManager = $this->connection->getSchemaManager();
        $coutTable = $schemaManager->listTableDetails("{$this->bdd2}.cout");

        $positionAdministrativeForeignKey = new ForeignKeyConstraint(
            array("position_administrative_id"),
            "{$this->bdd2}.position_administrative",
            array("position_administrative_id")
        );

        $macroRubriqueForeignKey = new ForeignKeyConstraint(
            array("code_macro_rubrique", "millesime"),
            "{$this->bdd1}.macro_rubrique",
            array("code_macro_rubrique", "millesime")
        );

        $planComptableForeignKey = new ForeignKeyConstraint(
            array("code_alpha_compte", "code_numerique_compte", "millesime"),
            "{$this->bdd1}.plan_comptable",
            array("code_alpha_compte", "code_numerique_compte", "millesime")
        );

        $regroupementCompteForeignKey = new ForeignKeyConstraint(
            array("code_regroupement_compte", "millesime"),
            "{$this->bdd1}.regroupement_compte",
            array("code_regroupement_compte", "millesime")
        );

        $schemaManager->createForeignKey($positionAdministrativeForeignKey, $coutTable);
        $schemaManager->createForeignKey($macroRubriqueForeignKey, $coutTable);
        $schemaManager->createForeignKey($planComptableForeignKey, $coutTable);
        $schemaManager->createForeignKey($regroupementCompteForeignKey, $coutTable);
    }

Pour utiliser ma fonction listTableDetails sous MySQL, il faudrait que je change le paramètre "dbname" qui correspond à ma base de données principale par le nom de ma base de données créée à la volée avant l'appel à cette fonction listeTableDetails.
Alors que sous PostgreSQL, je ne rencontre aucun problème car je passe le nom du schéma avant la table tel que :

Code:

 $schemaManager->listTableDetails("{$this->poems}.cout");

J'espère avoir été claire dans mon expression, merci par avance de m'aider à trouver une solution pour l'utilisation d'une connexion entre une base de données principale et une autre dynamque (créée à la volée), sous MySQL ou PostgreSQL.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages