IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Amélioration pour Doctrine 1.2.3


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 80
    Points : 169
    Points
    169
    Par défaut Amélioration pour Doctrine 1.2.3
    Bonjour,

    travaillant avec la version 1.2.3 de Doctrine (et Symfony 1.4.8), nous avons été confronté à une problématique qui revient souvent dans les forums. Je n'ai pas forcément cherché longtemps, mais il n'y a, à ma connaissance, pas encore de moyen de contournement propre.

    La problématique est la suivante : Comment faire pour réaliser des jointures entre des tables qui sont dans des bases de données différentes (à noter ici, que nous travaillons avec MySQL/InnoDB).

    j'ai donc un peu travaillé sur le sujet, et je suis arrivé à quelque chose qui me convient et que j'ai soumis au projet Doctrine.

    Je tiens cependant à vous faire part du résultat pour que vous puissiez m'apporter vos critiques.

    le premier point est d'ajouter une constante à la classe Doctrine_Core. Voir le fichier une fois modifié mis en pièce jointe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const ATTR_DATABASE_NAME                = 0x1DB;
    Cette nouvelle constante permet d'ajouter, dans le fichier databases.yml, un attribut optionnel database_name, qui permet d'indiquer le nom de la base de données attachée au DSN doctrine.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      gesdoc:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:host=127.0.0.1;dbname=gesdoc
          username: root
          password: 
          attributes:
            database_name: gesdoc
            default_table_collate: utf8_general_ci
            default_table_charset: utf8
    de là, un certain nombre de modifications (très peu, en fait) ont été apportées dans la classe Doctrine_Query. Ces modifications démarrent aux lignes 1759, 1862, 1971 et 1983. Voir pour cela, le fichier en pièce jointe.

    Ensuite, pour peu que les modèles aient été bien préparés, il sera possible de générer des requêtes Doctrine avec des jointures entre bases de données.

    La préparation des modèles passe par la bonne écriture du schema.yml en y indiquant la connexion à utiliser pour chaque modèle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Document:
      connection: gesdoc
      tableName: document
      columns:
    ...
      relations:
        Contrat:
          local: contrat_id
          foreign: id
          type: one
    ...
    Contrat:
      connection: gescdc
      tableName: contrat
      columns:
    ...
    ce qui permet de générer pour l'exemple ci dessus un modèle Document (lié à la connexion "gesdoc"), référençant le modèle Contrat (lié à la connexion "gescdc") via une relation many2one.

    les modèles auront ainsi le schéma suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Doctrine_Manager::getInstance()->bindComponent('Document', 'gesdoc');
    abstract class BaseDocument extends sfDoctrineRecord{
    ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Doctrine_Manager::getInstance()->bindComponent('Contrat', 'gescdc');
    abstract class BaseContrat extends sfDoctrineRecord{
    ...
    }
    la requete suivante peut alors s'exécuter sans problème majeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $x = DocumentTable::getInstance()->createQuery('d')
                                                        ->leftJoin('d.Contrat c')
                                                        ->execute();

    Voila, je ne sais pas si certains d'entre vous ont déjà été confronté à ce problème, mais cette solution semble corriger cette limitation de Doctrine.

    toute remarque/correction est évidemment la bienvenue, puisqu'il est possible que je sois passé à côté de quelque chose lors de mes tests de régression.

    HTH.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Générateur d' état amélioré pour Access ?
    Par clickandgo dans le forum IHM
    Réponses: 7
    Dernier message: 28/01/2011, 02h13
  2. Des améliorations pour les appareils photo NEX-5/NEX-3
    Par Mejdi20 dans le forum Communiqués
    Réponses: 0
    Dernier message: 20/10/2010, 10h41
  3. Réponses: 5
    Dernier message: 01/12/2009, 19h18
  4. Config a améliorer pour Assassin's Creed
    Par Rakken dans le forum Composants
    Réponses: 2
    Dernier message: 03/05/2008, 00h42
  5. Réponses: 2
    Dernier message: 06/05/2006, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo