我的网站使用 2 个数据库,其中包括一个与其他特定网站数据库相关的中央用户数据库。
有时打电话
new User(array('db'=>'adapter1'));
就足够了(但永远不方便);但其他时候,例如在声明不同数据库上的表之间的关系时,则无法执行此操作。
有谁知道在 Zend_Db_Table_Abstract 类中指定要使用哪个数据库适配器的方法吗?
谢谢!
很晚才回到这个话题,但这里的答案都对我没有帮助。我的一些数据库模型需要使用“tdb”,并且将以下代码添加到每个类中以自动发生这种情况:
protected function _setupDatabaseAdapter()
{
$this->_db = Zend_Registry::get('tdb');
parent::_setupDatabaseAdapter();
}
感谢大家一路以来的建议!
Zend_Db_Table_Abstract 提供了一个静态方法来设置默认数据库适配器。请按以下步骤操作:
Zend_Db_Table_Abstract::setDefaultAdapter($adapter);
现在,所有 Table 对象都将默认使用您的适配器。
注意:在线文档有时并没有明确说明这一点,因此第二个最佳检查位置是此处的 API:http://framework.zend.com/apidoc/core/
您可以在构造函数中将类变量 $_db 设置为正确的适配器。
global $adapter1; //There are better ways than using a global variable
$this->_db = $adapter1;
假设适配器对象可以在构造函数中引用。这似乎不太便携,但我相信它会起作用。
可以使用 init 函数,它不用于
Zend_Db_Adapter_Abstract,
可以在你的类中使用来设置需要完成的任何操作。 _setAdapter
接受命名注册表项的字符串。
public function init()
{
$this->_setAdapter('tdb');
}
生产中特定不同数据库的示例。 您可以在这里应用一些逻辑。
class SomeTable extends Zend_Db_Table_Abstract {
/*
*
*/
public function init(){
if(APPLICATION_ENV == 'production'){
$secondary_db = Zend_Db::factory(
'PDO_MYSQL',
Array(
'host' => DB_SECONDARY_HOST,
'username' => DB_SECONDARY_USER,
'password' => DB_SECONDARY_PASSWORD,
'dbname' => DB_SECONDARY_NAME,
'charset' => 'utf8'
)
);
$this->_setAdapter($secondary_db);
}
}
/*
*
*/
}