Как использовать схему для нескольких sqlite db для Zend_Db_Table

Итак, у меня есть несколько баз данных sqlite. /путь/database1.db /путь/database2.db

Когда я создаю для него Zend_Db_Table, как мне указать, какую базу данных использовать?

class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
{
    protected $_schema = 'database1.db';
    protected $_name = 'user';
}

Кажется, это не работает.

В моем текущем решении я использую multidb и расширяю Zend_Db_Table_Abstract, и у меня есть переопределение _setup, например

...... Bootstrap - then use the multidb key for _database
$multiDb = $this->getPluginResource('multidb');
$multiDb->init();
Zend_Registry::set('db', $multiDb);
...... My/Table.php
class My_Table extends Zend_Db_Table_Abstract
{
    public function _setup()
    {
        if($this->_database) {
            $this->_setAdapter(Zend_Registry::get('db')->getDb($this->_database));
        }
    }
}
....... DbTables/Table1.php
class Application_Model_DbTable_Table1 extends My_Table
{
    protected $_database = 'database1';
    protected $_name = 'table1';
}

Но мне просто интересно, может быть, уже есть способ. Спасибо


person Lasiaf    schedule 05.06.2011    source источник


Ответы (1)


Самое простое, что я могу придумать, это переопределить Zend_Db_Table_Abstract::_setupDatabaseAdapter(), например

protected function _setupDatabaseAdapter()
{
    if (!$this->_db) {
        $multiDb = Zend_Registry::get('multidb');
        $this->_setAdapter($multiDb->getDb('database1'));
    }
}

Вам не нужно ничего добавлять в Bootstrap, так как ресурсы приложения автоматически регистрируются в Zend_Registry.

Я бы даже пошел дальше и поместил это в собственный абстрактный класс, например

abstract class Application_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
    protected function _setupDatabaseAdapter()
    {
        // as above
    }
}

Затем ваши конкретные DbTable классы расширят это.

person Phil    schedule 06.06.2011
comment
Не похоже, что Zend_Registry автоматически добавляет мои ресурсы. что-то особенное, что мне нужно включить? Это то же самое, что у меня уже есть. Наверное, прямого пути пока нет. Благодарность - person Lasiaf; 07.06.2011
comment
@Lasiaf Моя ошибка. Хотя Zend_Application_Bootstrap_BootstrapAbstract использует Zend_Registry для внутреннего использования, это не глобально доступный экземпляр. - person Phil; 07.06.2011