【问题标题】:how to connect to another db with doctrine on zend framework如何使用zend框架上的学说连接到另一个数据库
【发布时间】:2010-07-13 11:03:37
【问题描述】:

我使用 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;
}

【问题讨论】:

    标签: php zend-framework doctrine


    【解决方案1】:

    您还可以将 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');
    

    【讨论】:

      【解决方案2】:

      这假定没有使用 Zend 或类似的规则的 Doctrine!

      它已经存在于您的代码中,您只需在连接中添加另一行。我建议将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

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

      【讨论】:

        【解决方案3】:

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

        顺便说一句,您当然不必使用 Zend_Registry 并在每个请求上打开所有连接,因此只需将此视为示例实现,而不是作为解决问题的指南。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-02
          • 1970-01-01
          • 2011-04-07
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多