. */ /** * class Doctrine_Export_Schema * * Different methods to import a XML schema. The logic behind using two different * methods is simple. Some people will like the idea of producing Doctrine_Record * objects directly, which is totally fine. But in fast and growing application, * table definitions tend to be a little bit more volatile. importArr() can be used * to output a table definition in a PHP file. This file can then be stored * independantly from the object itself. * * @package Doctrine * @subpackage Export * @link www.phpdoctrine.com * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @version $Revision: 1838 $ * @author Nicolas BĂ©rard-Nault */ class Doctrine_Export_Schema { /** * buildSchema * * Build schema array that can be dumped to file * * @param string $directory * @return void */ public function buildSchema($directory = null, $models = array()) { $array = array(); if ($directory) { $loadedModels = Doctrine::loadModels($directory); } else { $loadedModels = Doctrine::getLoadedModels(); } $parent = new ReflectionClass('Doctrine_Record'); $sql = array(); $fks = array(); // we iterate trhough the diff of previously declared classes // and currently declared classes foreach ($loadedModels as $name) { if (!empty($models) && !in_array($name, $models)) { continue; } $class = new ReflectionClass($name); // check if class is an instance of Doctrine_Record and not abstract // class must have method setTableDefinition (to avoid non-Record subclasses like symfony's sfDoctrineRecord) // we have to recursively iterate through the class parents just to be sure that the classes using for example // column aggregation inheritance are properly exported to database while ($class->isAbstract() || ! $class->isSubclassOf($parent) || ! $class->hasMethod('setTableDefinition') || ( $class->hasMethod('setTableDefinition') && $class->getMethod('setTableDefinition')->getDeclaringClass()->getName() !== $class->getName())) { $class = $class->getParentClass(); if ($class === false) { break; } } if ($class === false) { continue; } $record = new $name(); $recordTable = $record->getTable(); $data = $recordTable->getExportableFormat(); $table = array(); $table['tableName'] = $data['tableName']; $table['className'] = get_class($record); foreach ($data['columns'] AS $name => $column) { $data['columns'][$name]['name'] = $name; } $table['columns'] = $data['columns']; $relations = $recordTable->getRelations(); foreach ($relations as $key => $relation) { $relationData = $relation->toArray(); $relationKey = $relationData['alias']; if (isset($relationData['refTable']) && $relationData['refTable']) { $table['relations'][$relationKey]['refClass'] = $relationData['refTable']->getComponentName(); } if (isset($relationData['class']) && $relationData['class'] && $relation['class'] != $relationKey) { $table['relations'][$relationKey]['class'] = $relationData['class']; } $table['relations'][$relationKey]['local'] = $relationData['local']; $table['relations'][$relationKey]['foreign'] = $relationData['foreign']; if ($relationData['type'] === Doctrine_Relation::ONE) { $table['relations'][$relationKey]['type'] = 'one'; } else if($relationData['type'] === Doctrine_Relation::MANY) { $table['relations'][$relationKey]['type'] = 'many'; } else { $table['relations'][$relationKey]['type'] = 'one'; } } $array[$table['className']] = $table; } return $array; } /** * exportSchema * * @param string $schema * @param string $directory * @return void */ public function exportSchema($schema, $format = 'yml', $directory = null, $models = array()) { $array = $this->buildSchema($directory, $models); Doctrine_Parser::dump($array, $format, $schema); } }