Zend_Db_Table使用不同的连接适配器进行读取和写入
在当前的ZF项目中,我必须使用不同的数据库连接进行读取和写入。我approuch是通过扩展Zend_Db_Table_Abstract(和Zend_Db_Table_Row_Abstract)做到这一点Zend_Db_Table使用不同的连接适配器进行读取和写入
它看起来像这样的时刻:
class SomeNamespace_Db_Table extends Zend_Db_Table_Abstract {
/**
* @var Zend_Db
*/
protected $read = NULL;
/**
* @var Zend_Db
*/
protected $write = NULL;
/**
* Constructor.
*
* Supported params for $config are:
* - db = user-supplied instance of database connector,
* or key name of registry instance.
* - name = table name.
* - primary = string or array of primary key(s).
* - rowClass = row class name.
* - rowsetClass = rowset class name.
* - referenceMap = array structure to declare relationship
* to parent tables.
* - dependentTables = array of child tables.
* - metadataCache = cache for information from adapter describeTable().
*
* @param mixed $config Array of user-specified config options, or just the Db Adapter.
* @return void
*/
public function __construct($config=array()){
$this->read = Zend_Registry::get('read');
$this->write = Zend_Registry::get('write');
$config['db'] = $this->read;
return parent::__construct($config);
}
/**
* Inserts a new row.
*
* @param array $data Column-value pairs.
* @return mixed The primary key of the row inserted.
*/
public function insert(array $data){
$this->setAdapter($this->write);
$result = parent::insert($data);
$this->setAdapter($this->read);
return $result;
}
/**
* Updates existing rows.
*
* @param array $data Column-value pairs.
* @param array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses.
* @return int The number of rows updated.
*/
public function update(array $data, $where){
$this->setAdapter($this->write);
$result = parent::update($data,$where);
$this->setAdapter($this->read);
return $result;
}
/**
* Fetches a new blank row (not from the database).
*
* @param array $data OPTIONAL data to populate in the new row.
* @param string $defaultSource OPTIONAL flag to force default values into new row
* @return Zend_Db_Table_Row_Abstract
*/
public function createRow(array $data = array(), $defaultSource = NULL){
$this->setAdapter($this->write);
$result = parent::createRow($data, $defaultSource);
$this->setAdapter($this->read);
return $result;
}
/**
* Deletes existing rows.
*
* @param array|string $where SQL WHERE clause(s).
* @return int The number of rows deleted.
*/
public function delete($where){
$this->setAdapter($this->write);
$result = parent::delete($where);
$this->setAdapter($this->read);
return $result;
}
/**
* Allow to set current used connection
* from Enalog_Db_Table_Row
*
* @param Zend_Db $db
*/
public function setAdapter($db){
$this->_db = self::_setupAdapter($db);
return $this;
}
}
我喜欢,这是办法不多冗余代码。 (在Zend_Db_Table_Row我也将不得不覆盖save和setFromArray方法)
对此的任何建议?两个DB连接之间的切换应尽可能透明。
TIA Rufinus
您的代码看起来不错。无论如何,你的子类必须拦截每个可用的方法,而且我也没有看到bug会如何蔓延。一个大问题是:代码是否有用?
我更新了我的帖子到现在运行的代码。这么长时间没有问题。 – Rufinus 2010-01-14 09:51:38
我发现这篇文章http://www.amazium.com/blog/using-different-databases-with-zend-framework,可帮助您在使用的Zend_Db_Table不同的连接适配器。
请[为链接提供上下文](http://stackoverflow.com/questions/how-to-answer)。在你的回答中直接总结相关的观点;添加链接以获取更多信息。 – Gilles 2011-06-23 18:53:58
我在这里问了一个类似的问题:http://stackoverflow.com/questions/1826798/master-slave-switch-in-the-zend-framework-application-layer – Pro777 2009-12-14 20:07:08