как подключиться к другому БД с доктриной на Zend Framework - PullRequest
1 голос
/ 13 июля 2010

Я использую Zend Framework 1.10 с интеграцией в Doctrine 1.2.

в файле application.ini , объявляю ' dsn 'для подключения к базе данных.

в моем приложении мне нужно подключиться к другой БД для выполнения некоторых запросов.

как я могу это сделать?

мне нужно только выполнить запрос, я не хочу создавать все модели для этой БД.

прямо сейчас в bootstrap.php я делаю соединение по умолчанию:

     protected function _initDoctrine()
        {
            $this->getApplication()->getAutoloader()
                ->pushAutoloader(array('Doctrine', 'autoload'));
            spl_autoload_register(array('Doctrine', 'modelsAutoload'));

            $doctrineConfig = $this->getOption('doctrine');
            $manager = Doctrine_Manager::getInstance();
            $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
            $manager->setAttribute(
              Doctrine::ATTR_MODEL_LOADING,
              $doctrineConfig['model_autoloading']
            );

            Doctrine_Core::loadModels($doctrineConfig['models_path']);

            $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
            $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
            Doctrine_Core::generateModelsFromDb('models', array('doctrine'), array('generateTableClasses' => true));
         return $conn;
}

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

Вы также можете сохранить экземпляры Doctrine в Zend_Registry и получить тот, который вам нужен позже.

$conn1 = Doctrine_Manager::connection(...);
Zend_Registry::set('conn1',$conn1);

$conn2 = Doctrine_Manager::connection(...);
Zend_Registry::set('conn2',$conn2);

Затем вы можете получить его, выполнив следующие действия:

$conn1 = Zend_Registry::get('conn1');
$conn2 = Zend_Registry::get('conn2');
1 голос
/ 13 июля 2010

Это подразумевает обычную Доктрину без использования Zend или тому подобного!

Она уже есть в вашем коде, вам просто нужно добавить еще одну строку с вашим соединением.Я рекомендую http://www.doctrine -project.org / projects / orm / 1.2 / docs / manual / connections / en как хорошее чтение, так как в нем подробно рассматривается эта проблема.Чтобы лучше понять, о чем я говорю:

$conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');

Это соединение с именем doctrine, чтобы установить второе соединение, просто создайте другое соединение с другим именем, например

Doctrine_Manager::connection($doctrineConfig['dsn'],'second_connection');

Теперь у вас есть два соединения: ваше уже известное doctrine и только что созданное second_connection.

Прочитайте ссылку сверху, чтобы узнать, как обрабатывать поиск различных соединений.При запросе моделей вы можете указать, какое соединение вы хотите использовать в качестве необязательного параметра.

1 голос
/ 13 июля 2010

Просто добавьте еще одну DSN для вашей другой БД и подключитесь к ней с помощью PDO ...

Фактически мы определили наши базы данных в конфигурации Zend следующим образом (с использованием XML), чтобыобслуживает несколько соединений с БД:

    <databases>
        <db_one>
            <adapter>pdo_mysql</adapter>
            <params>
                <dbname>...</dbname>
                <username>...</username>
                <password>...</password>
                <host>...</host>
                <port>...</port>
            </params>
        </db_one>
        <db_two>
            <adapter>pdo_mysql</adapter>
            <params>
                <dbname>...</dbname>
                <username>...</username>
                <password>...</password>
                <host>...</host>
                <port>...</port>
            </params>
        </db_two>
    </databases>

(Конечно, они на самом деле не называются db_one и db_two, но имеют правильное имя: p).

edit

Вы можете инициализировать соединения с БД следующим образом (вызовите это где-нибудь в вашей начальной загрузке):

private function initDb()
{
    foreach ($this->config->databases as $name => $database) {
        try {
            $db = Zend_Db::factory($database);
            // Hack for MySQL utf8 encoding...
            if ($database->adapter == 'pdo_mysql') {
                $db->getConnection();
                $db->query('SET NAMES utf8');                   
            }
            Zend_Registry::set($name, $db);
        } catch (Zend_Db_Adapter_Exception $e) {
            throw new Application_Exception($e->getMessage());
        } catch (Zend_Exception $e) {
            throw new Application_Exception($e->getMessage());
        }
    }
}

Затем, если вы хотите выполнить запрос к db_two в любом месте вашего кода, вы можетеиспользуйте:

$db = Zend_Registry::get('db_two');
$stmt = $db->query('select ... from ...');

И используйте fetch () или fetchAll () для $ stmt, как считаете нужным.

Кстати, вам не нужно использовать Zend_Registry и открывать все соединения при каждом запросеконечно, так что просто рассмотрите это как пример реализации, а не как руководство по решению вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...