可以從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