2010-12-09 101 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