伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

[覚書]Yiiで複数データ・ソースを扱う

今日は完全な覚書です。
 
僕はYiiが大好きです。あ、PHPのフレームワークのことです。
(ぼくにとっては)使いやすい。現在はYii2がベータ版で開発中。
giiというGUIでのCRUDジェネレータがあり、
管理画面を作るにはとっても手軽、かつ、高機能に振る舞ってくれる
CRUD画面をつくってくれます。
 


こういったフレームワークにかならずついてくるのがORMやらARやら。
YiiにももちろんARがあります。
CActiveRecordを継承したクラスをつくれば、それで「はい完成」。
(もちろんテーブル名の設定などは必要ですが)
 
ただし、CActiveRecordは、初期値でフレームワークに設定されるDBへの接続を前提につくられており、複数データソースに接続する場合はちょこっと改造が必要です。
 


複数データソースへの接続

'components'=>array(
	'db'=>array(
		'connectionString' => 'mysql:host=host;dbname=databasename',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
)

初期値ではこんな感じの設定がconfigにあります。
1つのデータソースへの接続ですね。
 
これを…

'components'=>array(
	'db'=>array(
		'connectionString' => 'mysql:host=host;dbname=databasename',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
	'db2'=>array(
		'class' => 'CDbConnection',//←これ追加
		'connectionString' => 'mysql:host=host;dbname=database2',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
)

こんな風にすると、2つめのデータソースへは

Yii::app()->db2

でアクセス可能です。おぉ。便利。


ARで利用

class TableModel extends CActiveRecord
{
	/**
	 * テーブル名を指定
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'tablename';
	}
	
}

YiiのActiveRecordは最低限これだけ書けばARクラスをつくることができます。
ただ、前述のとおり、Yiiのアクティブレコードは初期で設定されているYii::app()->dbを前提としていますので、2つめのデータソースのAR作成は、ちょこっと変更が必要。
 
そのやり方が…

class DB2Model extends CActiveRecord
{
	
	/**
	 * データ接続先を設定
	 */
	public function getDbConnection()
	{
		return Yii::app()->db2;
	}
	
	/**
	 * テーブル名
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'sessions';
	}
	
}

こんな感じgetDbConnection()をオーバーロードして、
configで追加した別のデータソースをリターンするだけ。
 
おお。さらに便利。


 
誰得です。現場からは以上です。

コメントを残す

Your email address will not be published.

*