nmtysh.log

Tech系のネタや日々の独り言などを書いています。

beforeSave() でDBを切り替える

Master/Slave なレプリケーションをしている場合、更新系は MasterDB に変更します。

CakePHP だと $this->useDbConfig を書き換える必要があります。
今までだと Model.php の save($data, $validate, $fieldList) をオーバーライドする必要がありました。

    public function save($data = null, $validate = true, $fieldList = array()) {
        $oldDb = $this->useDbConfig;
        $this->useDbConfig = 'master';
        $return = parent::save($data, $validate, $fieldList);
        $this->useDbConfig = $oldDb;
        return $result;
    }


ですが、 CakePHP 2.3.3 からは beforeSave($options) で DBの変更が可能になっていました!
Re-assign $db after beforeSave. · 62660c6 · cakephp/cakephp · GitHub

こんな感じ

    public function beforeSave($options = array()) {
        $this->useDbConfig = 'master';
        return parent::beforeSave($options);
    }


ただし、 beforeSave() は Behavior の beforeSave() から呼ばれているので、 Behavior で DB への操作があると意図した結果にならない可能性があります。
また、 validates() も beforeSave() より前に処理されているので validates() でも同様に DB へのアクセスがあるとデータの整合性がおかしくなる可能性があります。

beforeSave() ではなく save() をオーバーライドしていた方が良さそうですね。

関連: CakePHP: 高速開発 php フレームワーク。 Home
cakephp/cakephp · GitHub
Re-assign $db after beforeSave. · 62660c6 · cakephp/cakephp · GitHub
cakephp/lib/Cake/Model/Model.php at 62660c67069f54b92f302cd2f0eff6ef075e3b2e · cakephp/cakephp · GitHub