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); } /*//////以下、諸々の処理////////*/ }