2009-12-14 30 views
2

在当前的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

+0

我在这里问了一个类似的问题:http://stackoverflow.com/questions/1826798/master-slave-switch-in-the-zend-framework-application-layer – Pro777 2009-12-14 20:07:08

回答

2

您的代码看起来不错。无论如何,你的子类必须拦截每个可用的方法,而且我也没有看到bug会如何蔓延。一个大问题是:代码是否有用?

+0

我更新了我的帖子到现在运行的代码。这么长时间没有问题。 – Rufinus 2010-01-14 09:51:38

1

还有另一种方式来做到这一点,显示here

相关问题