忍者ブログ

きままなひとりごと

引っ越しました。新しいブログはnmtysh.logです。
2015/12/27

ブログを引っ越しました

ブログの引っ越しを行いました。
別サービスへの移行になるため過去記事をすべて再確認しつつ、記事の削除やリンクの差し替えなどを行っています。
現在では役に立たなくなっているtipsなどは削除していますのでご了承ください。

新しいブログはこちらです。
nmtysh.log

今後は新しいブログのほうで更新していきますのでそちらをご覧ください。
2017/01/18 (Wed) 00:01

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2013/05/21 (Tue) 00:50

[PHP][CakePHP] 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

拍手[0回]

PR