. */ namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; use Symfony\Components\Console\Input\InputArgument, Symfony\Components\Console\Input\InputOption, Symfony\Components\Console; /** * Command to update the database schema for a set of classes based on their mappings. * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel */ class UpdateCommand extends Console\Command\Command { /** * @see Console\Command\Command */ protected function configure() { $this ->setName('orm:schema-tool:update') ->setDescription( 'Processes the schema and either update the database schema of EntityManager Storage Connection or generate the SQL output.' ) ->setDefinition(array( new InputArgument( 'from-path', InputArgument::REQUIRED, 'The path of mapping information.' ), new InputOption( 'from', null, InputOption::PARAMETER_REQUIRED | InputOption::PARAMETER_IS_ARRAY, 'Optional paths of mapping information.', array() ), new InputOption( 'complete', null, InputOption::PARAMETER_NONE, 'If defined, all assets of the database which are not relevant to the current metadata will be dropped.' ), new InputOption( 'dump-sql', null, InputOption::PARAMETER_NONE, 'Instead of try to apply generated SQLs into EntityManager Storage Connection, output them.' ) )) ->setHelp(<<getHelper('em')->getEntityManager(); $reader = new \Doctrine\ORM\Tools\ClassMetadataReader(); $reader->setEntityManager($em); // Process source directories $fromPaths = array_merge(array($input->getArgument('from-path')), $input->getOption('from')); foreach ($fromPaths as $dirName) { $dirName = realpath($dirName); if ( ! file_exists($dirName)) { throw new \InvalidArgumentException( sprintf("Mapping directory '%s' does not exist.", $dirName) ); } else if ( ! is_readable($dirName)) { throw new \InvalidArgumentException( sprintf("Mapping directory '%s' does not have read permissions.", $dirName) ); } $reader->addMappingSource($dirName); } // Defining if update is complete or not (--complete not defined means $saveMode = true) $saveMode = ($input->getOption('complete') === null); // Retrieving ClassMetadatas $metadatas = $reader->getMetadatas(); if ( ! empty($metadatas)) { // Create SchemaTool $tool = new \Doctrine\ORM\Tools\SchemaTool($em); if ($input->getOption('dump-sql') === null) { $sqls = $tool->getUpdateSchemaSql($metadatas, $saveMode); $output->write(implode(';' . PHP_EOL, $sqls)); } else { $output->write('Updating database schema...' . PHP_EOL); $tool->updateSchema($metadatas, $saveMode); $output->write('Database schema updated successfully!' . PHP_EOL); } } else { $output->write('No Metadata Classes to process.' . PHP_EOL); } } }