2010-12-09 8 views
2

Ich benutze Multidb-Muster in Zend Framework.Filter SELECT und INSERT/UPDATE/DELETE Abfragen in Zend Framework

Normalerweise werde ich Master/Slave-Architektur von MysqlDB verwenden.

So ist meine Frage, was soll ich SELECT-Abfragen von Slave-Datenbank und INSERT/UPDATE/DELETE-Abfragen auf Master-Datenbank

Mein application.ini ausführen tun, um sieht aus wie

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 

Deshalb möchte ich Führen Sie alle SELECT-Abfragen für die sekundäre Datenbank und alle INSERT/UPDATE/DELETE für die primäre Datenbank aus.

Antwort

1

Ich glaube, insert/update/delete sollte gut funktionieren, das heißt:

My_Model_DbTable_MyTable.php:

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

Wenn Sie jedoch die sekundäre Datenbank verwenden möchten, können Sie nicht in der Lage sein zu verwenden, die typische $ this-> select() Methode:

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

Durch nochmaliges Überschreiben von getAdapter(), wie oben gezeigt, müssen Sie keinerlei Änderungen vornehmen, wenn Sie auf die Primärdatenbank zugreifen, aber wenn Sie die Sekundärdatenbank benötigen, müssen Sie den Sekundäradapter über $ this-> getAdapter (' secondary ') und speichern Sie es in einer Variablen, zB $ db, und rufen Sie dann die Methoden select/insert/update/delete mit dem Objekt $ db auf.

EDIT Geringfügige Modifikation oben Code. Sie sollten versuchen, $ this -> _ db standardmäßig für getAdapter() zu verwenden und $ db-> ersetzt $ this-> für fetch(), update(), insert(), delete() usw., nicht für 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

Vielen Dank für Ihre Antworten Jungs, aber stil ich bin nicht klar. Ich möchte einfach eine zentralisierte Funktion, die ausgeführt wird, bevor eine MySql-Abfrage ausgeführt wird und diese Funktion die Verbindung je nach Art der Abfrage zur Laufzeit ändert, dh wenn Abfrage ausgewählt ist dann auf db-2 ausführen und Abfrage ist einfügen, aktualisieren oder löschen dann führe es auf db-1 aus. Hoffentlich bin ich klar –