[英]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.