通常はスレーブに接続
↓
更新クエリ実行前にマスターに接続
↓
更新クエリ実行
↓
更新クエリ実行後、スレーブに接続を戻す
↓
通常スレーブに接続
class DATABASE_CONFIG { var $default = array( // as MySQL slave server 'driver' => 'mysql', 'persistent' => false, 'host' => 'スレイブのホスト', 'login' => 'ユーザー名', 'password' => 'パスワード', 'database' => 'DB名', 'encoding' => 'utf8' ); var $master = array( // as MySQL master server 'driver' => 'mysql', 'persistent' => false, 'host' => 'マスターのホスト', 'login' => 'ユーザー名', 'password' => 'パスワード', 'database' => 'DB名', 'encoding' => 'utf8' ); }
<?php /* * 通常時は default で接続しているので、 * 更新系クエリのときだけ master に切り替える */ class AppModel extends Model { function save($data = null, $validate = true, $fieldList = array()) { $oldDb = $this->useDbConfig; $this->setDataSource('master'); $val = parent::save($data, $validate, $fieldList); $this->setDataSource($oldDb); return $val; } function updateAll($fields, $conditions = true) { $oldDb = $this->useDbConfig; $this->setDataSource('master'); $val = parent::updateAll($fields, $conditions); $this->setDataSource($oldDb); return $val; } function delete($id = null, $cascade = true) { $oldDb = $this->useDbConfig; $this->setDataSource('master'); $val = parent::delete($id, $cascade); $this->setDataSource($oldDb); return $val; } function deleteAll($conditions, $cascade = true, $callbacks = false) { $oldDb = $this->useDbConfig; $this->setDataSource('master'); $val = parent::deleteAll($conditions, $cascade, $callbacks); $this->setDataSource($oldDb); return $val; } }
$sql = 'upate users ...'; $oldDb = $this->useDbConfig; $this->setDataSource('master'); if(!$this->query($sql)) { $this->setDataSource($oldDb); return false; } $this->setDataSource($oldDb);