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