CodeIgneiterで処理内容によって複数のDBに切り替えて処理したい場合のメモ。
前提としてController毎でDBの接続を切り替えるようにする。
要は、コントローラー名でmoduleの初期化のタイミングで接続先を切り替える。
①application/config/database.phpにDBの設定を行う。
初期の状態では「default」という名前で設定されているが、そこに任意の名前で切り替えたいDBの設定を記述。
$active_group = 'default'; //設定名 $active_record = TRUE; /*///////デフォルトで設定(用意)されているDB設定//////*/ $db['default']['hostname'] = 'p:localhost'; //`mysqli`ドライバー利用時には「hosntame」の設定でサーバのアドレスの前に「p:」を付ける $db['default']['username'] = 'root'; $db['default']['password'] = 'root'; /*///////省略、//////*/ /*///////追加したいDB設定 とりあえずdb2という名前で設定//////*/ $db['db2']['hostname'] = 'p:localhost'; $db['db2']['username'] = 'root'; $db['db2']['password'] = 'root'; $db['db2']['database'] = 'hoge_database'; $db['db2']['dbdriver'] = 'mysqli'; $db['db2']['dbprefix'] = ''; $db['db2']['pconnect'] = TRUE; $db['db2']['db_debug'] = TRUE; //TRUEを指定すると、データベースエラーが発生した際に処理を停止させ、ブラウザに エラーメッセージを表示 $db['db2']['cache_on'] = FALSE; $db['db2']['cachedir'] = ''; $db['db2']['char_set'] = 'utf8'; $db['db2']['dbcollat'] = 'utf8_general_ci'; $db['db2']['swap_pre'] = ''; $db['db2']['autoinit'] = TRUE; //データベースインスタンスがロードされるタイミングで データベースに接続する $db['db2']['stricton'] = FALSE; //データをセットする際の自動型変換
②moduleの設定。
いろいろ使いまわしたいので基底のModuleクラスとしてapplication/coreにMY_Modelを設置
class MY_Model extends CI_Model {
/**
* constructor
*/
public function __construct() {
parent::__construct();
//controller名取得
$controller_name = $this->router->fetch_class();
/*
* controllerがhogeコントローラーの場合はdb2に接続
* それ以外はdefault設定のDBに接続
*/
if($controller_name == "article" ){
$db_name = 'db2';
} else {
$db_name = 'default';
}
//DB接続
$this->load->database($db_name);
}
/*//////以下、諸々の処理////////*/
}
