Yii - 使用CActiveRecord删除或保存到多个数据库

时间:2013-05-29 11:23:35

标签: php activerecord yii multiple-databases

我希望我的模型在多个数据库中执行某些操作。假设我的模型是User类。它扩展了SynchroAR类(SynchroAR扩展了CActiveRecord)。 在用户类中:

protected function afterSave()
{
    if($this->goSynchro)
        $this->runSynchro('save');
    parent::afterSave();
}

在SynchroAR中:

protected function runSynchro($method)
{
    $this->goSynchro = false;
    foreach($this->entryConns as $conn)
    {
        parent::$db = $conn;
        parent::$db->setActive(true);
        call_user_func(array($this, $method));
    }
    $this->goSynchro = true;
    parent::$db = Yii::app()->usersdb;
    parent::$db->setActive(true);
}

$entryConns是一个包含应该应用$method的连接的数组。现在我在$entryConns中有一个条目。我打开CWebLogRoute它实际上是save()方法,但我想它在同一个数据库上执行了两次,因为第二个数据库中的数据没有被更改。为什么呢?

1 个答案:

答案 0 :(得分:2)

我猜这是因为$ db是静态的。

灵感来自: http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/

我会在你的SynchroAR课程中尝试这样的事情。

...
private $_currentDb = null;
public function setDb($db = null)
{
    if($db === null)
    {
        $this->_currentDb = null;
        parent::$db->setActive(true);
    }
    else
    {
        $this->_currentDb = $db;
        $this->_currentDb->setActive(true);
    }
}
public function getDbConnection()
{
    if($this->_currentDb !== null)
        return $this->_currentDb;
    else
        return parent::$db;
}
protected function runSynchro($method)
{
    $this->goSynchro = false;
    foreach($this->entryConns as $conn)
    {
        $this->setDb($conn);
        call_user_func(array($this, $method));
    }
    $this->goSynchro = true;
    $this->setDb();
}