Адаптеры 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'));


}

Приложение.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);

    }
}

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


person Jimit Shah    schedule 24.05.2012    source источник
comment
разве это не должно быть $this->_dbw->getAdapter(); or ->getDb() вы, вероятно, не хотите сбрасывать свой адаптер по умолчанию, но вы хотите получить экземпляр второго адаптера. Допускаю, что документация в данном случае нехорошая, так что я тоже не уверен.   -  person RockyFord    schedule 24.05.2012
comment
@RockyFord я уже сделал это в своем загрузочном файле, сохранил в реестре и получил его в классе Model.   -  person Jimit Shah    schedule 24.05.2012


Ответы (2)


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

_setAdapter установит новый адаптер для существующей таблицы базы данных, а 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);
}
person aporat    schedule 24.05.2012

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

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();
    }

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

person RockyFord    schedule 24.05.2012