Фильтруйте запросы SELECT и INSERT / UPDATE / DELETE в Zend Framework - PullRequest
2 голосов
/ 09 декабря 2010

Я использую шаблон multidb в Zend Framework.

Обычно я использую архитектуру master / slave MysqlDB.

Поэтому мой вопрос заключается в том, что я должен сделать для выполнения запросов SELECT из подчиненной базы данных и запросов INSERT / UPDATE / DELETE для основной базы данных

Мой application.ini выглядит как

resources.multidb.primary.adapter = PDO_MYSQL
resources.multidb.primary.host = localhost
resources.multidb.primary.username = root
resources.multidb.primary.password = 123456
resources.multidb.primary.dbname = tubaah_zend
resources.multidb.primary.default = true

resources.multidb.secondary.adapter = PDO_MYSQL
resources.multidb.secondary.host = localhost
resources.multidb.secondary.username = root
resources.multidb.secondary.password = 123456
resources.multidb.secondary.dbname = tubaah

Итак, я хочу выполнить все запросы SELECT для вторичной базы данных и все INSERT / UPDATE / DELETE для первичной базы данных.

Ответы [ 2 ]

1 голос
/ 24 января 2011
function getAdapter($name = 'primary') {
    $resource = $this->getPluginResource('multidb');
    $resource->init();

    // Ensure only primary and secondary are allowed
    if ($name == 'secondary' || $name == 'primary') {
        return $resource->getDb($name);
    } else {
        return $this->_db;
    }
}

function selectFromSecondary() {
    $db = $this->getAdapter('secondary');
    $select = $this->select(true);
    return $db->fetchAll($select); // normally this is $this->fetchAll()
}
1 голос
/ 13 декабря 2010

Я считаю, что вставка / обновление / удаление должны работать нормально, т. Е .:

My_Model_DbTable_MyTable.php:

function myFunction() {
    $this->insert()
    $this->update()
    $this->delete()
}

Однако, если вы хотите использовать вторичную базу данных, вы не сможете использовать типичный метод $ this-> select ():

My_Model_DbTable_MyTable.php

// Override getAdapter() function to be able to obtain secondary database
function getAdapter($name = 'primary') {
    $resource = $this->getPluginResource('multidb');
    $resource->init();

    // Ensure only primary and secondary are allowed
    if ($name == 'secondary' || $name == 'primary') {
        return $resource->getDb($name);
    } else {
        return $this->_db;
    }
}

function selectFromSecondary() {
    $db = $this->getAdapter('secondary');
    $select = $this->select(true);
    return $db->fetchAll($select); // normally this is $this->fetchAll()
}

Опять же, переопределив getAdapter (), как показано выше, вам не нужно будет вносить какие-либо изменения при доступе к первичной базе данных, но если вам нужна вторичная, вам необходимо получить вторичный адаптер через $ this-> getAdapter («вторичный») и сохраните его в переменной, то есть в $ db, а затем вызовите методы select / insert / update / delete с помощью объекта $ db.

РЕДАКТИРОВАТЬ Небольшое изменение кода выше. Вы должны попытаться использовать $ this -> _ db по умолчанию для getAdapter (), а $ db-> заменяет $ this-> для fetch (), update (), insert (), delete () и т. Д., А не для select ( ).

...