我使用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;
}
答案 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
。
阅读上面的链接,了解如何处理不同连接的检索。查询模型时,您可以定义要用作可选参数的连接。