繁体   English   中英

如何在zend框架上使用理论连接到另一个数据库

[英]how to connect to another db with doctrine on zend framework

我将Zend Framework 1.10与Doctrine 1.2集成在一起使用。

application.ini文件中,我声明了“ dsn ”以连接到数据库。

在我的应用程序中,我需要连接到另一个数据库以运行一些查询。

我该怎么做 ?

我只需要运行query,我就不想为此数据库生成所有模型。

现在在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;
}

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

只需为另一个数据库添加另一个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并在每个请求上都打开所有连接,因此,仅将其作为示例实现,而不作为解决问题的准则。

这假设没有使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM