既にある程度システムが組まれていて、途中から Master/Slave 構成にする場合に、 既存のコードを極力変更せずに、Master/Slave 切り替えながら クエリー発行できるようにする。
アソシエーションがある場合にも対応する。
たとえば、User モデル に対して行う場合、 User モデルを継承した UserSlave モデルを作る。
以下のプロパティを追加する
$alias
は、親のモデルと同じものを設定する- 例えば、UserSlave モデルの場合は、
public $alias = 'User';
となる
- 例えば、UserSlave モデルの場合は、
$useDbConfig
は、database.php に設定した slave 用のエントリを設定する$useTable
は、親のモデルと同じものを設定する- 例えば、UserSlave モデルの場合は、
public $useTable = 'users';
となる
- 例えば、UserSlave モデルの場合は、
- 親のモデルにアソシエーションの定義がある場合、それ用の YyySlave モデルを同じように設定し、定義部分の class を Yyy から YyySlave に変更
例えば、以下のような設定になる
<?php
App::uses('User', 'Model');
class UserSlave extends User {
public $alias = 'User';
public $useDbConfig = 'slave';
public $useTable = 'users';
public $hasMany = array(
'Article' => array(
'className' => 'ArticleSlave',
'foreignKey' => 'user_id',
),
);
}
class User extends AppModel {
public $actsAs = array('MasterSlave');
}
<?php
$this->User = ClassRegistry::init('User');
$users = $this->User->getSlaveInstance()->find('all');
$this->User->getSlaveInstance()
の返却値は、 UserSlave
モデルのインスタンスになる