FuelPHPのormを複数DBに対応させる方法

FuelPHP Advent Calendar 2012 20日目の担当の@6q5です。

昨日は、@ttikittFuelPHPへのDoctrine2組み込みでした。

今年は仕事で3つもFuelPHPを使った媒体に関わり、
FuelPHPと共に過ごした1年でした。
その経験で得た物の中から選りすぐりの1つ?を紹介します。

ormでDBクラスのexecuteのようにDB接続先を指定することができません。

DBがMaster/Slave構成の時に、ormを使って参照だけの時はSlaveに向けたいなどしたい時に不便です。

例 config/db.php こんな感じでconfigに2つのDB設定がされてるとします。
/**
 * The development database settings.
 */
return array(
    'default' => array(
        'connection' => array(
            'dsn' => 'mysql:host=xxx.xxx.xxx.xxx;dbname=BLOG_DEV',
            'username' => 'blog',
            'password' => 'xxxxxxxx',
        ),  
    ),
    'slave' => array(
        'connection' => array(
            'dsn' => 'mysql:host=xxx.xxx.xxx.xxx;dbname=BLOG_DEV',
            'username' => 'blog',
            'password' => 'xxxxxxxx',
        ),
    ),  
); 
例 DBクラス
$query = DB::select('user_id','exp')
    ->from('users')
    ->where('user_id', $user_id)
    ->execute('slave') // 引数で指定できる
    ->as_array();
例 ORM
$query = Model_User::find()
    ->where('user_id', $user_id)
    ->get(); // でっできないっっ

それを可能にするには以下のようにします。 

packages/orm/classes/query.phpを拡張するためapp以下にコピー
mkdir -p app/classes/core/orm/
cp ../packages/orm/classes/query.php app/classes/core/orm/
app/classes/core/orm/query.phpに以下のメソッドを追加
+
+       /**
+        * Change Connection
+        *
+        * @param   String connection
+        * @return  Query
+        */
+       public function connection($connection='default')
+       {
+               $this->connection = $connection;
+               return $this;
+       }
packages/orm/classes/bootstrap.phpを以下のように書き換え
-       'OrmQuery'        => __DIR__.'/classes/query.php'
+       'OrmQuery'        => APPPATH.'/classes/core/orm/query.php',
結果
$result = Model_User::find()
    ->where('user_id', $user_id)
    ->where('status', Model_User::STATUS_ACTIVE)
    ->connection('slave') // できたヽ(^o^)丿
    ->get_one();

これでormを使って複数DBの切り替えが出来るようになりました。

おまけ tasksをproductionモードでcronに設定する

fuel/app/tasks/batch.php をProductionモードでcronに設定する場合、

5 * * * * env FUEL_ENV=production /usr/local/bin/php oil r batch

開発環境と本番環境を区別させて実行するための必須設定ですね

以上!

あすは、@konkon1234さんの『(仮)FuelPHPで1サイトを作ってみて気が付いた点など』です。
お楽しみに!