可以从ini配置文件中读取到数据库的配置,然后去设置成表的适配器
比如配置文件为:
[databases]
db.news.adapter = PDO_MYSQL
db.news.config.host = 192.168.1.115
db.news.config.username = root
db.news.config.password = 123456
db.news.config.dbname = news
db.news.config.port = 3306
db.user.adapter = PDO_MYSQL
db.user.config.host = 192.168.1.116
db.user.config.username = vhost
db.user.config.password = 123456
db.user.config.dbname = user
db.user.config.port = 3306
在index.php中获取到配置文件中的数据
$databasese = new Zend_Config_Ini('./application/config/db.ini','databases');
然后将这些数据去设置表的默认适配器,就是说将几个数据库放到这个项目中来,以供使用。代码如下:
foreach($databases->db as $config_name => $db){
$dbAdapters[$config_name] = Zend_Db::factory($db->adapter,
$db->config->toArray());
if((boolean)$db->default){
Zend_Db_Table::setDefaultAdapter($dbAdapters[$config_name]);
}
}
当然,这里不用配置文件,你用数组去定义数据库的配置数据也一样可以。这里的意义在于将若干个数据库配置到项目中来,接下来就需要在实际需要中选择对应的数据库。
针对每个model文件,需要去继承一个抽象类,这个抽象类就将确定你这个model连接到哪个数据库。
在model文件中,添加一个protected $_use_adapter = ' * ';在抽象类中用这个值去确定用哪个数据库。
abstract class AppDbTable extends Zend_Db_Table
{
function AppDbTable($config = null){
if(isset($this->_use_adapter)){
$dbAdapters = Zend_Registry::get("dbAdapters");
$config = ($dbAdapters[$this->_use_adapter]);
$config->query('SET NAMES UTF8');
}
return parent::__construct($config);
}
}
至于最终的Zend_Db_Table参见 http://framework.zend.com/manual/1.12/zh/zend.db.table.html 的解释。注意抽象类,所以不能直接实例 化,只能先继承该类,然后实例化子类。还有,跟与类同名的方法,会被当成构造方法。所以这个抽象类中没有直接的构造方法。
以上的解释为:model需要连接数据库,就得先知道要连哪个数据库,一个中间人把这个再去给连接一下给model使用。
最终model类是这个样子:
class Type extends AppDbTable
{
protected $_name ="news_type";
protected $_primary = 'id';
protected $_use_adapter = 'news';
......
}
中间加一层继承AppDbTable类的子类,在里面添加一些model公用的一些方法,这样设计会比较好。
同样的解决办法,英文版:http://hi.baidu.com/weimade/item/d0cbfd5d090cfe454fff2077