propel:build-schemaで、プラグイン内のテーブルまで含めてしまうのを回避
これって他に回避方法あるのかな?
phpmyadminでテーブル編集 => PDF編集ページでER図作成 => スキーマビルド => モデルビルド の手順でやってるけど、これだとプラグイン内のテーブルまで混ぜてしまい、ビルドエラーに…
ということで回避するために、build-model後にプラグイン内のテーブルを除外するコード。YAMLにしか対応していないので注意を。
<?php /** * build-schemaで生成されたものから、プラグインで生成されたテーブルを除外 * * * */ class sfPropelIgnoreSchemaPluginTask extends sfPropelBuildSchemaTask { /** * @see sfTask */ protected function configure() { parent::configure(); $this->aliases = array('propel-ignore-plugin-schema'); $this->namespace = 'propel'; $this->name = 'ignore-plugin-schema'; $this->briefDescription = 'Creates a schema from an existing database'; $this->detailedDescription = "propel:ignore-plugin-schema"; } /** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { parent::execute($arguments, $options); $this->ignore(); } /** * get tables from plugin * * @return array */ protected function getPluginTables() { if (!$dirs = $this->configuration->getPluginSubPaths('/config')) { return; } $schemas = sfFinder::type('file')->name('*schema.yml')->prune('doctrine')->in($dirs); $tables = array(); foreach($schemas as $schema) { $this->log($schema); $y = new sfPropelDatabaseSchema(); $y->loadYAML($schema); $s = $y->getTables(); foreach($s as $tableName => $table) { $tables[] = $tableName; $this->log(" - ".$tableName); } } return $tables; } protected function ignore() { $ignoreTables = $this->getPluginTables(); $ymlSchemaPath = sfConfig::get('sf_config_dir').'/schema.yml'; $schema = sfYaml::load($ymlSchemaPath); foreach($ignoreTables as $t) { unset($schema['propel'][$t]); } $y = new sfPropelDatabaseSchema(); $y->loadArray($schema); file_put_contents($ymlSchemaPath, $y->asYAML()); } }