2010-07-13 4 views
1

J'utilise Zend Framework 1.10 avec intégration sur Doctrine 1.2.comment se connecter à un autre db avec doctrine sur zend framework

dans le application.ini, je déclare la 'dsn' pour se connecter à la base de données. Dans mon application, j'ai besoin de me connecter à une autre base de données pour exécuter certaines requêtes.

comment puis-je le faire?

J'ai seulement besoin d'exécuter une requête, je ne veux pas générer tous les modèles pour cette base de données.

en ce moment dans le bootstrap.php je fais la connexion par défaut:

 protected function _initDoctrine() 
     { 
      $this->getApplication()->getAutoloader() 
       ->pushAutoloader(array('Doctrine', 'autoload')); 
      spl_autoload_register(array('Doctrine', 'modelsAutoload')); 

      $doctrineConfig = $this->getOption('doctrine'); 
      $manager = Doctrine_Manager::getInstance(); 
      $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 
      $manager->setAttribute(
       Doctrine::ATTR_MODEL_LOADING, 
       $doctrineConfig['model_autoloading'] 
      ); 

      Doctrine_Core::loadModels($doctrineConfig['models_path']); 

      $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine'); 
      $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true); 
      Doctrine_Core::generateModelsFromDb('models', array('doctrine'), array('generateTableClasses' => true)); 
     return $conn; 
} 

Répondre

1

Ceci suppose une Doctrine régulière sans l'utilisation de Zend ou similaire!

Il est déjà là dans votre code, il vous suffit d'ajouter une autre ligne avec votre connexion. Je suggère http://www.doctrine-project.org/projects/orm/1.2/docs/manual/connections/en comme une bonne lecture car il traite beaucoup de ce problème. Pour avoir une meilleure idée de ce dont je parle:

$conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine'); 

Ceci est une connexion avec le nom doctrine, pour effectuer une deuxième connexion, il suffit de créer une autre connexion avec un autre nom comme

Doctrine_Manager::connection($doctrineConfig['dsn'],'second_connection'); 

Maintenant, vous avoir deux connexions, votre déjà connu doctrine et le nouvellement créé second_connection.

Lire le lien ci-dessus pour voir comment gérer la récupération de différentes connexions. Lorsque vous interrogez les modèles, vous pouvez définir la connexion que vous souhaitez utiliser en tant que paramètre facultatif.

1

d'ajouter une autre source de données pour votre autre DB, et connectez-vous à l'aide que l'on PDO ...

En fait, nous avons défini nos bases de données dans la configuration Zend comme suit (en utilisant XML), pour répondre à plusieurs connexions DB:

<databases> 
     <db_one> 
      <adapter>pdo_mysql</adapter> 
      <params> 
       <dbname>...</dbname> 
       <username>...</username> 
       <password>...</password> 
       <host>...</host> 
       <port>...</port> 
      </params> 
     </db_one> 
     <db_two> 
      <adapter>pdo_mysql</adapter> 
      <params> 
       <dbname>...</dbname> 
       <username>...</username> 
       <password>...</password> 
       <host>...</host> 
       <port>...</port> 
      </params> 
     </db_two> 
    </databases> 
<databases> 
     <db_one> 
      <adapter>pdo_mysql</adapter> 
      <params> 
       <dbname>...</dbname> 
       <username>...</username> 
       <password>...</password> 
       <host>...</host> 
       <port>...</port> 
      </params> 
     </db_one> 
     <db_two> 
      <adapter>pdo_mysql</adapter> 
      <params> 
       <dbname>...</dbname> 
       <username>...</username> 
       <password>...</password> 
       <host>...</host> 
       <port>...</port> 
      </params> 
     </db_two> 
    </databases> 

(Bien sûr, ils ne s'appellent pas vraiment db_one et db_two, mais ont un nom propre: p).

modifier

Vous pouvez initialiser les connexions DB comme suit (appelez cela quelque part dans votre bootstrap):

private function initDb() 
{ 
    foreach ($this->config->databases as $name => $database) { 
     try { 
      $db = Zend_Db::factory($database); 
      // Hack for MySQL utf8 encoding... 
      if ($database->adapter == 'pdo_mysql') { 
       $db->getConnection(); 
       $db->query('SET NAMES utf8');     
      } 
      Zend_Registry::set($name, $db); 
     } catch (Zend_Db_Adapter_Exception $e) { 
      throw new Application_Exception($e->getMessage()); 
     } catch (Zend_Exception $e) { 
      throw new Application_Exception($e->getMessage()); 
     } 
    } 
} 

Ensuite, si vous souhaitez effectuer une requête sur db_two partout dans votre code , vous pouvez utiliser:

$db = Zend_Registry::get('db_two'); 
$stmt = $db->query('select ... from ...'); 

et utiliser fetch() ou fetchAll() sur $ stmt comme bon vous semble.

BTW Vous n'avez pas besoin d'utiliser Zend_Registry et d'ouvrir toutes les connexions sur chaque requête, bien sûr, considérez cela comme un exemple d'implémentation, pas comme un guide sur la façon de résoudre votre problème.

+0

peut u détaillées sur la connexion à dB2 via pdo, grâce –

+0

ok, a ajouté le code correspondant, – wimvds

3

Vous pouvez également stocker des instances de Doctrine dans Zend_Registry et récupérer celui que vous voulez plus tard.

$conn1 = Doctrine_Manager::connection(...); 
Zend_Registry::set('conn1',$conn1); 

$conn2 = Doctrine_Manager::connection(...); 
Zend_Registry::set('conn2',$conn2); 

Puis, plus tard vous pouvez le récupérer en procédant comme suit:

$conn1 = Zend_Registry::get('conn1'); 
$conn2 = Zend_Registry::get('conn2'); 
Questions connexes