2012-05-22 4 views
0

Я использую классическое соединение, которое создается в bootstap, считывая параметры из файла application.ini. Я бы хотел использовать больше внешних БД, но я не могу их прочитать из application.ini. Я предпочитаю читать параметры из основной БД (какая внешняя БД это, зависит от веб-сайта). Итак, как эффективно установить соединение в модели? Теперь я устанавливаю это соединение каждый раз, когда мне нужно его использовать. И когда мне нужно использовать основную БД, необходимо снова установить соединение. Это очень неэффективное решение.Сделать второе подключение к внешней БД

function joinClientDB($id) 
{ 
    $web = $this->getById($id); 
    $dbSettings = array(); 
    $dbSettings['host'] = $web['web_dbHost']; 
    $dbSettings['username'] = $web['web_dbUsername']; 
    $dbSettings['password'] = $web['web_dbPassword']; 
    $dbSettings['dbname'] = $web['web_dbName']; 
    $this->_db = Zend_Db::factory('pdo_mysql', $dbSettings); 
    $this->_db->query('SET CHARACTER SET ' . $web['web_dbCharset']); 
} 

function joinDefaultDb() 
{ 
    $this->_db = Zend_Registry::get('db'); 
} 

Есть ли для меня какие-либо простые решения?

+0

Похоже, что ваша конфигурация собирается позволить неограниченное количество конфигураций соединения db. С такой архитектурой ваши варианты с тем, что ZF может сделать, будут ограничены. Лучшее, на что вы можете надеяться, это построить плагин, который регистрирует правильные параметры БД с каждым запросом. – RockyFord

+0

Теоретически да, но практически нет. Мне нужно подключение, первое основное (которое я загружаю с параметрами из application.ini) и второй дополнительный, какие параметры я должен получить из этого основного БД. В идеале я сделаю singleton в первых параметрах получения с соответствующей моделью. Я не знаю, хорошее ли это решение. Как на этом решении с плагином? – tomasr

ответ

0

Я бы предложил использовать плагин Zend MULTI DB. Добавить в свой applications.ini все соединения с базой данных:

; Database ONE 
resources.multidb.test.adapter = 
resources.multidb.test.dbname = 
resources.multidb.test.username = 
resources.multidb.test.password = "" 
resources.multidb.test.host = "your.local.host" 
resources.multidb.test.default = true 

; Database TWO 
resources.multidb.live.adapter = 
resources.multidb.live.dbname = 
resources.multidb.live.username = 
resources.multidb.live.password = "" 
resources.multidb.live.host = "your.live.host.com" 

И теперь вы можете поместить их в реестре снова (bootstrap.php):

protected function _initDbAdapters() 
{ 
    $this->bootstrap('multidb'); 
    $resource = $this->getPluginResource('multidb'); 
    $resource>init(); 

    $testDB = $resource->getDb('test'); 
    $liveDB = $resource->getDb('live'); 

    Zend_Registry::set('DB_TEST', $testDB); 
    Zend_Registry::set('DB_LIVE', $liveDB); 
} 
+0

Мне нужна вторая БД (внешняя), связанная с параметрами, которые хранятся в основной БД (написано выше). – tomasr

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