2012-05-24 11 views
1

У меня возникла проблема с zend multidb. Мои адаптеры не переключаются и которые когда-либо устанавливаются по умолчанию, привыкают каждый раз. А также это не дает мне никакой ошибки. Ниже приведен код, который я использую для функции zend multidb.Адаптеры Zend MultiDB не переключаются

Bootstrap.php

public function _initDB() 
{ 
    Zend_Registry::getInstance();  
    $this->bootstrap('multidb'); 
    $multidb = $this->getPluginResource('multidb'); 
    Zend_Registry::set('dbR', $multidb->getDb('dbR')); 
    Zend_Registry::set('dbW', $multidb->getDb('dbW')); 


} 

Application.ini

resources.multidb.dbR.adapter = "mysqli" 
resources.multidb.dbR.host = "xxx.xxx.x.xx" 
resources.multidb.dbR.username = "root" 
resources.multidb.dbR.password = "admin" 
resources.multidb.dbR.dbname = "test_app1" 
resources.multidb.dbR.profiler = "false" 
resources.multidb.dbR.isDefaultTableAdapter = "true" 

resources.multidb.dbW.adapter = "mysqli" 
resources.multidb.dbW.host = "xxx.xxx.x.xx" 
resources.multidb.dbW.username = "root" 
resources.multidb.dbW.password = "admin" 
resources.multidb.dbW.dbname = "test_app2" 

Теперь в моем классе модели я использую следующую строку кода, где я хочет выполнить любую операцию записи

class Abc_Model_ModelName extends Zend_Db_Table_Abstract 
{ 
    protected $_dbR; 
    protected $_dbW; 
    protected $_name = 'table_name'; 


    public function init(){ 
     $this->_dbR = Zend_Registry::get("dbR"); 
     $this->_dbW = Zend_Registry::get("dbW"); 
    } 

    public function addedit($data = array()) 
    { 
     $this->setDefaultAdapter($this->_dbW); 

    } 
} 

может ли кто-нибудь помочь мне с этим?

+0

не должна быть '$ это -> _ dbw-> getAdapter(); или -> getDb() 'вы, вероятно, не хотите сбросить свой адаптер по умолчанию, но вы хотите получить и экземпляр второго адаптера. Я допускаю, что документация в этом случае не очень хорошая, поэтому я тоже не уверен. – RockyFord

+0

@RockyFord Я уже делал это в своем загрузочном файле и сохраняю его в реестре и извлекаю его в классе модели –

ответ

1

Я считаю, вам нужно позвонить в $this->_setAdapter($reader); вместо setDefaultAdapter() function.

_setAdapter установит новый адаптер в существующую таблицу db, а setDefaultAdapter() установит только адаптер по умолчанию, который будет использоваться с этого момента.

Что-то вроде:

/** 
* Returns an instance of a Zend_Db_Table_Select object. 
* 
* @param bool $withFromPart Whether or not to include the from part of the select based on the table 
* @return Zend_Db_Table_Select 
*/ 
public function slaveSelect($withFromPart = self::SELECT_WITHOUT_FROM_PART) 
{ 
    $reader = $this->_getMultiDb()->getRandomReadOnlyAdapter(); 
    $this->_setAdapter($reader); 
    return parent::select($withFromPart); 
} 
+0

спасибо @aporat :) –

1

Похоже, вам необходимо либо передать экземпляр адаптера в БД при вызове модели в контроллере:

public function someAction() { 
    $db = Zend_Registry::get("dbW"); 
    $model = new Abc_Model_ModelName(array('db'=>$db)); 
} 

или вы можете переопределить конструктор в вашем классе модели:

public function __construct() { 
    $this->_db = Zend_Registry::get("dbW"); 
    parent::__construct(); 
} 

адаптер базы данных, подготавливается в конструкторе Zend_Db_Table_Abstract:

/** 
    * 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()) 
    { 
     /** 
     * Allow a scalar argument to be the Adapter object or Registry key. 
     */ 
     if (!is_array($config)) { 
      $config = array(self::ADAPTER => $config); 
     } 

     if ($config) { 
      $this->setOptions($config); 
     } 

     $this->_setup(); 
     $this->init(); 
    } 

Надеюсь, это поможет.

Смежные вопросы