2010-12-09 46 views
2

我在Zend Framework中使用multidb模式。在Zend框架中筛选SELECT和INSERT/UPDATE/DELETE查询

通常我会使用MysqlDB的主/从架构。

所以我的问题是我应该怎么办执行从从数据库和INSERT/UPDATE SELECT查询/主数据库上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。

回答

1

我相信插入/更新/删除应该只是正常工作,即:

My_Model_DbTable_MyTable.php:

function myFunction() { 
    $this->insert() 
    $this->update() 
    $this->delete() 
} 

但是,如果你想使用的辅助数据库,您可能无法使用典型的这 - $> 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('辅助')并将其存储到变量中,即$ db,然后使用$ db对象调用select/insert/update/delete方法。

编辑对上述代码稍作修改。你应该尝试为getAdapter()默认使用$ this - > _ db,并且$ db->将fetch(),update(),insert(),delete()等替换为$ this->,而不是select( )。

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() 
} 
+0

非常感谢您的答案,但我仍然不清楚。我只是想要一个集中的函数,在任何MySql查询执行之前执行,并且该函数将根据查询的类型在运行时更改连接,即如果查询被选择,然后在db-2上执行,并且如果查询是插入,更新或删除然后在db-1上执行它。希望我很清楚 – 2011-01-25 07:19:25