根据您提供给 Yii 论坛的链接,有一个扩展程序可以为您处理这个问题:
http ://www.yiiframework.com/extension/dbreadwritesplitting
如果你有很多 AR 模型,我可能会先研究一下。您可以选择行为路线(如该论坛帖子中所建议的那样)作为另一种选择。
但无论你做什么,你都会想要覆盖 beforeSave / afterSave 而不是 onBeforeSave / onAfterSave。这些方法用于触发事件,而不仅仅是运行您自己的特殊代码。而且,根据另一个论坛帖子,您需要使用静态调用设置您的 AR db 变量。所以 Sergey 的代码实际上应该是:
class MyActiveRecord extends CActiveRecord
{
...
public function beforeSave()
{
// set write DB
self::$db = Yii::app()->masterDb;
return parent::beforeSave();
}
public function afterSave()
{
// set read db
self::$db = Yii::app()->db;
return parent::beforeSave();
}
...
}
class User extends MyActiveRecord {}
class Post extends MyActiveRecord {}
...