symfony – Propel を仲介せずに databases.yml に書かれた設定や DB接続インスタンスを得る

sfDatabaseManager クラスを使うことで Propel より低いレイヤーでデータベースの情報を得たり、(Creaole による)データベース接続を行うことができます。
この方法を使うと databases.yml の設定を一時的に変更した上でデータベースアクセスができるようになります。

$manager = new sfDatabaseManager();
$manager->initialize(); // インスタンスに database.yml ファイルを読み込んで初期化する。
$db = $manager->getDatabase(“propel”); // “propel:” 以下を参照し、sfDatabase のインスタンスを得る。 引数を省略すると default: を参照する
 
// database.yml の設定を参照する例:
echo $db->getParameter(“phptype”).”\n”; // propel: param: phptype: を参照(“mysql” など)
echo $db->getParameter(“host”).”\n”; // propel: param: host: を参照(localhost など)
echo $db->getParameter(“database”).”\n”; // propel: param: database: を参照
echo $db->getParameter(“username”).”\n”; // propel: param: username: を参照
 
// databases.yml の設定を一時的に上書きする例:
$db->setParameter(“database”, null); // 特定のデータベースに接続しない。
                                     // (データベースが存在しなくてもエラーにならないため
                                     // CREATE DATABASE したい場合やテーブルを一切利用
                                     // しない場合などに有用)
 
// データベース接続の例:
// databases.yml の設定をもとに Creole のデータベース接続インスタンスを得る
// (vendor/creole/Connelction.php で定義される Connection 抽象クラスのインスタンス)
$con = $db->getConnection();
 
$rs = $con->executeQuery(“SELECT CURRENT_TIMESTAMP AS time”); // クエリを発行。
while($rs->next()){ // ポインタを進める(複数レコード対応)
    $row = $rs->getRow(); // レコードを連想配列で取得
    echo $row[“time”];
}

 
参考:
Class sfDatabaseManager(symfony API)
 sfDatabaseManager のクラス定義。
 
Class sfDatabase(symfony API)
 sfDatabaseManager::getDatabase() で得られるインスタンスの定義。
 
SymfonyAPI – Connection Interface Reference(cpr.in-berlin.de による symfony の phpdoc)
 sfDatabase::getConnection() で得られるインスタンスの定義。
 
SymfonyAPI – ResultSet Interface Reference(同上)
 Connection::executeQuery() で得られるインスタンスの定義。