symfonyで複数DBの指定

symfony1.2で複数DBに接続するやり方について。

参考リンク
http://symfony.xrea.jp/1.0/book/08-Inside-the-Model-Layer.html#extended.schema.syntax

symfonyではアプリケーションごとに複数DBを持つことができる。テーブル数が多い場合、もしくは接続先が複数ある場合、このアプローチが便利。


symfonyのモデルクラス生成コマンドは、config/下にある

 ・schema.yml、もしくは
 ・schema.ymlで終わるすべてのファイル(hoge_schema.yml とか)

を勝手にロードする(grepしているらしい)。


例えば、databases.ymlの中で定義した db1 と db2 を使う場合、生成されるモデルクラス群をサブディレクトリに分類できる。

手順

1. config/database.yml(スキーマ定義) 設定をリストで並べて普通に記述。
#cofig/database.yml
all:
 db2:
   class:        sfPropelDatabase
   param:
     classname:  PropelPDO
     dsn:        pgsql:dbname=db1;host=localhost
     (略)
 db1:
   class:        sfPropelDatabase
   param:
     classname:  PropelPDO
     dsn:        pgsql:dbname=db1;host=localhost
2. config/schema.yml を自動生成して db1-schema.ymlにリネーム。--connection で接続指定をするのがポイント。
$ symfony propel:build-schema --connection="db1"
$ mv config/schema.yml config/db2-schema.yml

#自動生成では細かいところがうまくいかないので、実務では手直しが必要になることが多い。

3. config/db1-schema.yml でpackage指定を追記する。
# config/db1-schema.yml
db1:
 _attributes: { phpName: Article, package: lib.model.db1 }
 ・・・

↑modelディレクトリの下にサブディレクトリdb1を作るつもり。

4. config/schema.ymlを自動生成して db2-schema.ymlにリネーム。必要に応じて先ほどと同様に手直しをする。
$ symfony propel:build-schema --connection="db2"
$ mv config/schema.yml config/db2-schema.yml
5. config/db2-schema.yml でpackage指定を追記。
# config/db2-schema.yml において
db2:
 _attributes: { phpName: Hit, package: lib.model.db2 }
 ・・・

↑modelディレクトリの下にサブディレクトdb2を作るつもり。

6. あとは生成コマンドをたたけば一発で複数DBのモデル生成ができる。
$ symfony propel:build-model

※パッケージは同じにすることもできるけど分けることが多いと思う。

マニュアルにも細かいことは書いておらず、上記手順で合っているのか自信が無い。
でも、ちゃんと動く環境を作ることはできた。