2011-05-25 112 views

回答

1

您可以使用的application.ini多个数据库:

resources.db.master.adapter   = "PDO_MYSQL" 
resources.db.master.default   = false 
resources.db.master.params.dbname = "db1" 
resources.db.master.params.host  = "127.0.0.1" 
resources.db.master.params.username = "root" 
resources.db.master.params.password = "" 
resources.db.slave.adapter   = "PDO_MYSQL" 
resources.db.slave.default   = true 
resources.db.slave.params.dbname  = "db2" 
resources.db.slave.params.host  = "127.0.0.1" 
resources.db.slave.params.username = "root" 
resources.db.slave.params.password = "" 

而在你的引导初始化:

public function _initDatabase() { 
     $config = $this->getApplication()->getOption('resources'); 

     $dbArrays = array(); 
     foreach($config['db'] as $name => $dbConf){ 
      // Set up database 
      $db = Zend_Db::factory($dbConf['adapter'], $dbConf['params']); 
      $db->query("SET NAMES 'utf8'"); 
      $dbArrays[$name] = $db; 

      if((boolean)$dbConf['default']){     
       Zend_Db_Table::setDefaultAdapter($db); 
      } 
      unset($db); 
     } 

     Zend_Registry::set("db", $dbArrays); 
    } 

在我来说,我一直保存每个适配器在注册表中,所以我可以使用它们稍后分开。 我还做了一类新的,像这样扩展Zend_Db_Table类在那里我有我自己的getAdapter($名):

public function getAdapter($name = null){ 
     if($name !== null){ 
      $dbAdapters = Zend_Registry::get('db'); 
      return $dbAdapters[$name]; 
     } 
     return parent::getAdapter(); 
    } 

随着在每个模型我可以这样做:

$this->getAdapter('slave')->fecthAll($sql); 
$this->getAdapter('master')->fecthAll($sql); 
1

在确定模块之前就会读取application.ini。我建议你忘记application.ini,而是尝试编写一个控制器插件,该控制器插件将根据选择哪个模块加载一些额外的配置。