如何在zend框架上使用doctrine连接到另一个db

时间:2010-07-13 11:03:37

标签: php zend-framework doctrine

我使用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 个答案:

答案 0 :(得分:3)

您还可以在Zend_Registry中存储Doctrine实例,并在以后检索您想要的实例。

$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 :(得分:1)

只需为您的其他数据库添加另一个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)。

修改

您可以按如下方式初始化数据库连接(在引导程序中的某处调用):

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 ...');

并根据需要在$ stmt上使用fetch()或fetchAll()。

BTW当然,您不必使用Zend_Registry并在每个请求上打开所有连接,因此请将此视为示例实现,而不是如何解决问题的指南。

答案 2 :(得分:1)

这假设普通的学说不使用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

阅读上面的链接,了解如何处理不同连接的检索。查询模型时,您可以定义要用作可选参数的连接。