①databases.ymlの書き方
config/databases.yml
all:
propel_db1:
class: sfPropelDatabase
param:
dsn: mysql://{DB1ログインID}:{DB1ログインID}@localhost///{DB1データベース名}
propel_db2:
class: sfpropelDatabase
param:
dsn: mysql://{DB2ログインID}:{DB2ログインID}@localhost/{DB2データベース名}
②schema.ymlの書き方
違う名前で2つ分けて作る
propelのpackageを指定しないと
symfony propel-build-sqlの時に以下のようなエラーが発生するので注意
PHP Fatal error: Call to a member function addTable() on a non-object in /usr/share/pear/symfony/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php on line 233
ちなみにsymfony propel-build-modelすると、ここで指定したpackage名のディレクトリの下にモデルが作られる
config/db1.schema.yml
propel_db1: # database.ymlに書いたpropel名と合わせる\\
_attributes: { package: lib.model.db1 } # 作成されるsql名を指定\\
table1:
id:
type: INTEGER
required: true
autoIncrement: true
primaryKey: true
title:
type: VARCHAR
size: 255
・・・
config/db2.schema.yml
propel_db2: #database.ymlに書いたpropel名と合わせる\\
_attributes: { package: lib.model.db2 }#作成されるsql名を指定\\
table2:
id:
type: INTEGER
required: true
autoIncrement: true
primaryKey: true
title:
type: VARCHAR
size: 255
・・・
③propel.iniの書き方
propel.iniに関しては「propel.ini」というファイル名のファイルがないとsymfony propel-build-sql
などでエラーが返ってくるので注意が必要
なのでファイル名を
propel.ini
propel_db2.ini
などとしておくとよいかも(propel.iniさえあればあとのファイル名はなんでもいい)
config/propel.ini
propel.targetPackage = lib.model.db1
propel.packageObjectModel = true
propel.project = {プロジェクト名}
propel.database = mysql
propel.database.createUrl = mysql://{DB1ログインID}:{DB1ログインID}@localhost/
propel.database.url = mysql://{DB1ログインID}:{DB1ログインID}@localhost/{DB1データベース名}
・・・
config/propel_db2.ini
propel.targetPackage = lib.model.db2
propel.packageObjectModel = true
propel.project = {プロジェクト名}
propel.database = mysql
propel.database.createUrl = mysql://{DB2ログインID}:{DB2ログインID}@localhost/
propel.database.url = mysql://{DB2ログインID}:{DB2ログインID}@localhost/{DB2データベース名}
・・・
④test_data.ymlの書き方
以下のようにディレクトリを分ける必要がある
data/fixtures/db1/test_data.yml data/fixtures/db2/test_data.yml
⑤load_data.phpの書き方
普通は最後の行(loadData)は一行だが、複数接続の場合は以下のように2行書くか、loadする動作を分けたければload_dataファイルを二つ作る必要がある
batch/load_data.yml
・・・
$data->loadData(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures' . DIRECTORY_SEPARATOR . 'db1', 'propel_db1');
$data->loadData(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures' . DIRECTORY_SEPARATOR . 'db2', 'propel_db2');
※注釈
上の設定をしないでいつもどおりphp batch/load_data.php
を実行すると以下のようなエラーが出る
PHP Fatal error: Uncaught exception 'PropelException' with message 'No connection params set for propel' in /usr/share/pear/symfony/vendor/propel/Propel.php:476 Stack trace: thrown in /usr/share/pear/symfony/vendor/propel/Propel.php on line 476 Fatal error: Uncaught exception 'PropelException' with message 'No connection params set for propel' in /usr/share/pear/symfony/vendor/propel/Propel.php:476\\ Stack trace: thrown in /usr/share/pear/symfony/vendor/propel/Propel.php on line 476
/usr/share/pear/symfony/addon/propel/sfPropelData.class.php
の39行目を見てみると
public function loadData($directory_or_file = null, $connectionName = 'propel')
{
$fixture_files = $this->getFiles($directory_or_file);
// wrap all database operations in a single transaction
$con = Propel::getConnection($connectionName);//←39行目
try
{
$con->begin();
$this->doDeleteCurrentData($fixture_files);
$this->doLoadData($fixture_files);
$con->commit();
}
catch (Exception $e)
{
$con->rollback();
throw $e;
}
}
loadData関数の第二引数がないときにデフォルトで$connectionName = 'propel'とされていることがわかるので、第二引数に設定したpropel名を渡せばエラーが出なくなる。
④symfony propel-insert-sqlについて
エラーが出るので代わりに以下のコマンドを打ちましょう
mysql -u root -p db1 < data/sql/lib.model.db1.schema.sql mysql -u root -p db2 < data/sql/lib.model.db2.schema.sql
公式ドキュメントではコマンドを打つたびにpropel.iniを書き換えろとあるのですが、さすがに面倒なので却下。
http://www.symfony-project.com/snippets/snippet/194
タグ : symfony php schema DB loadData 複数DB propel

