我在Zend Framework中使用multidb模式。
通常我会使用MysqlDB的主/从架构。
所以我的问题是如何从slave数据库执行SELECT查询和在master数据库上执行INSERT / UPDATE / DELETE查询
我的application.ini看起来像
resources.multidb.primary.adapter = PDO_MYSQL
resources.multidb.primary.host = localhost
resources.multidb.primary.username = root
resources.multidb.primary.password = 123456
resources.multidb.primary.dbname = tubaah_zend
resources.multidb.primary.default = true
resources.multidb.secondary.adapter = PDO_MYSQL
resources.multidb.secondary.host = localhost
resources.multidb.secondary.username = root
resources.multidb.secondary.password = 123456
resources.multidb.secondary.dbname = tubaah
所以我想在辅助数据库上运行所有SELECT查询,在主数据库上运行所有INSERT / UPDATE / DELETE。
答案 0 :(得分:1)
我认为插入/更新/删除应该可以正常工作,即:
My_Model_DbTable_MyTable.php:
function myFunction() {
$this->insert()
$this->update()
$this->delete()
}
但是,如果您希望使用辅助数据库,则可能无法使用典型的$ this-> select()方法:
My_Model_DbTable_MyTable.php
// Override getAdapter() function to be able to obtain secondary database
function getAdapter($name = 'primary') {
$resource = $this->getPluginResource('multidb');
$resource->init();
// Ensure only primary and secondary are allowed
if ($name == 'secondary' || $name == 'primary') {
return $resource->getDb($name);
} else {
return $this->_db;
}
}
function selectFromSecondary() {
$db = $this->getAdapter('secondary');
$select = $this->select(true);
return $db->fetchAll($select); // normally this is $this->fetchAll()
}
同样,通过覆盖如上所示的getAdapter(),如果访问主数据库,则无需进行任何更改,但如果您需要辅助数据库,则需要通过$ this->获取辅助适配器。 getAdapter('secondary')并将其存储到变量(即$ db)中,然后使用$ db对象调用select / insert / update / delete方法。
编辑 对上面的代码进行轻微修改。您应该尝试使用$ this-> _db默认为getAdapter()和$ db->替换$ this-> for fetch(),update(),insert(),delete()等,不适用于select()。
答案 1 :(得分:1)
function getAdapter($name = 'primary') {
$resource = $this->getPluginResource('multidb');
$resource->init();
// Ensure only primary and secondary are allowed
if ($name == 'secondary' || $name == 'primary') {
return $resource->getDb($name);
} else {
return $this->_db;
}
}
function selectFromSecondary() {
$db = $this->getAdapter('secondary');
$select = $this->select(true);
return $db->fetchAll($select); // normally this is $this->fetchAll()
}