CodeIgniter3を複数DBに対応させる

ちょっと規模が大きいサイトだとDBを分割したり、マスタースレイブ構成にするときに複数DBを利用する必要が出てきます。
今回はCodeIgniter3を複数DBに対応させる方法を紹介します。

設定

環境

  • PHP 5.6.30
  • CodeIgniter 3.1.5
  • CentOS 6.8
  • MySQL5.7

CodeIgniterの設定

/application/config/databse.phpを開いて$db[‘master’]配列を追加します。

// デフォルトDB設定
$db['default'] = array(
    //省略
);

// テストDB設定
$db['test'] = array(
    //省略
);

データベース(MySQL)の設定

MySQLでデフォルトDBとテストDBを作成してください。

デフォルトDBに以下のSQLを実行してください。

CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `title` varchar(100) NOT NULL COMMENT 'タイトル',
  PRIMARY KEY (id)
);
INSERT INTO `demo` (`id`, `title`) VALUES
(1, 'デフォルトDB1'),
(2, 'デフォルトDB2');

テストDBに以下のSQLを実行してください。

CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `title` varchar(100) NOT NULL COMMENT 'タイトル',
  PRIMARY KEY (id)
);
INSERT INTO `demo` (`id`, `title`) VALUES
(1, 'テストDB1'),
(2, 'テストDB2');

コントローラーに直接SQL文を書く場合

コントローラーを作る

/application/controllersTest.phpを作る。

class Test extends CI_Controller
{
    public function index()
    {
        // デフォルトDBのインスタンスを作る
        $defaultDB = $this->load->database('default', true);
        $res = $defaultDB->query('SELECT * FROM demo');
        print_r($res->result_array());

        // テストDBのインスタンスを作る
        $testDB = $this->load->database('test', true);
        $res = $testDB->query('SELECT * FROM demo');
        print_r($res->result_array());
    }
}

ルーティングを設定する

/application/config/route.phpにルーティングを追加してください。

$route['test'] =  'test/index';

http://アドレス/testにアクセスするとデフォルトDBとテストDBのデータが表示されます。

モデルでSQL文を実行する場合

モデルを作る

/application/modelsDemo_model.phpを作る。

class Demo_model extends CI_Model
{
    public function getDefault()
    {
        // デフォルトDBのインスタンスを作る
        $defaultDB = $this->load->database('default', true);
        $res = $defaultDB->query('SELECT * FROM demo');
        print_r($res->result_array());
    }

    public function getTest()
    {
        // テストDBのインスタンスを作る
        $testDB = $this->load->database('test', true);
        $res = $testDB->query('SELECT * FROM demo');
        print_r($res->result_array());
    }
}

コントローラーを作る

コントローラーに直接SQL文を書く場合で作ったTest.phpのindex()内を書き換えます。

class Test extends CI_Controller
{
    public function index()
    {
        $this->load->model('demo_model');
        // デフォルトDBのデータ
        $this->demo_model->getDefault();
        // テストDBのデータ
        $this->demo_model->getTest();
    }
}

http://アドレス/testにアクセスするとデフォルトDBとテストDBのデータが表示されます。