スポンサーリンク

[CakePHP1.2]Cakeでレプリケーションを使う場合

config/database.phpにマスター、スレーブのdb接続設定を以下のように追加する。

$default=array(DB設定); //スレーブ
$default_master=array(DB設定); //マスター
saveなどの保存メソッドの場合は設定名に’_master’を付加して設定を切り切り替えて保存処理。
終わったら元に戻す。
なお、何らかの理由でafterSave()コールバックで別のモデルの保存処理を行った場合、2重で’_master’を
付加してしまうため ”(!stristr($oldDb,’_master’))” の判定を追加している。

app_model.phpに下記を追加する。

	function save($data = null, $validate = true, $fieldList = array()) {
		// Remember the old config (default)
		$oldDb = $this->useDbConfig;
		// Set the new config
		if(!stristr($oldDb,'_master')){
			$this->setDataSource($oldDb.'_master');
		}
		// Call the original Model::save() method
		$return = parent::save($data, $validate, $fieldList);
		// Reset the config/datasource (default)
		$this->setDataSource($oldDb);

		return $return;
	}

	function updateAll($fields, $conditions = true) {
		$oldDb = $this->useDbConfig;
		if(!stristr($oldDb,'_master')){
			$this->setDataSource($oldDb.'_master');
		}
		$return = parent::updateAll($fields, $conditions);
		$this->setDataSource($oldDb);
		return $return;
	}

	function delete($id = null, $cascade = true) {
		$oldDb = $this->useDbConfig;
		if(!stristr($oldDb,'_master')){
			$this->setDataSource($oldDb.'_master');
		}
		$return = parent::delete($id, $cascade);
		$this->setDataSource($oldDb);
		return $return;
	}

	function deleteAll($conditions, $cascade = true, $callbacks = false) {
		$oldDb = $this->useDbConfig;
		if(!stristr($oldDb,'_master')){
			$this->setDataSource($oldDb.'_master');
		}
		$return = parent::deleteAll($conditions, $cascade, $callbacks);
		$this->setDataSource($oldDb);
		return $return;
	}