. */ namespace Doctrine\ORM\Tools\Console\Command\SchemaTool; use Symfony\Component\Console\Input\InputArgument, Symfony\Component\Console\Input\InputOption, Symfony\Component\Console\Input\InputInterface, Symfony\Component\Console\Output\OutputInterface, Doctrine\ORM\Tools\SchemaTool; /** * Command to generate the SQL needed to update the database schema to match * the current mapping information. * * @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 * @author Ryan Weaver */ class UpdateCommand extends AbstractCommand { /** * @see Console\Command\Command */ protected function configure() { $this ->setName('orm:schema-tool:update') ->setDescription( 'Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.' ) ->setDefinition(array( new InputArgument( 'action', InputArgument::OPTIONAL, 'Either "execute" (execute the SQL) or "dump-sql" (dump the SQL to the screen). If not specified, nothing is done.' ), new InputOption( 'complete', null, InputOption::VALUE_NONE, 'If defined, all assets of the database which are not relevant to the current metadata will be dropped.' ), )); $fullName = $this->getFullName(); $this->setHelp(<<$fullName command generates the SQL needed to synchronize the database schema with the current mapping metadata of the default entity manager. For example, if you add metadata for a new column to an entity, this command would generate and output the SQL needed to add the new column to the database: $fullName dump-sql Alternatively, you can execute the generated queries: $fullName execute Finally, be aware that if the --complete option is passed, this task will drop all database assets (e.g. tables, etc) that are *not* described by the current metadata. In other words, without this option, this task leaves untouched any "extra" tables that exist in the database, but which aren't described by any metadata. EOT ); } protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) { // Defining if update is complete or not (--complete not defined means $saveMode = true) $saveMode = ($input->getOption('complete') !== true); $sqls = $schemaTool->getUpdateSchemaSql($metadatas, $saveMode); if (0 == count($sqls)) { $output->writeln('Nothing to update - your database is already in sync with the current entity metadata.'); return; } $action = $input->getArgument('action'); if ('execute' == $action) { $output->writeln('Updating database schema...'); $schemaTool->updateSchema($metadatas, $saveMode); $output->writeln(sprintf('Database schema updated successfully! "%s" queries were executed', count($sqls))); } else if ('dump-sql' == $action) { $output->writeln(implode(';' . PHP_EOL, $sqls)); } else if (null === $action) { $output->writeln('ATTENTION: This operation should not be executed in a production environment.'); $output->writeln(' Use the incremental update to detect changes during development and use'); $output->writeln(' the SQL DDL provided to manually update your database in production.'); $output->writeln(''); $output->writeln(sprintf('The Schema-Tool would execute "%s" queries to update the database.', count($sqls))); $output->writeln('Please run the operation by passing an argument to this command:'); $output->writeln(sprintf(' %s execute to execute the command', $this->getFullName())); $output->writeln(sprintf(' %s dump-sql to dump the SQL statements to the screen', $this->getFullName())); } else { throw new \InvalidArgumentException(sprintf('The first argument - if specified - should be either "execute" or "dump-sql" ("%s" given).', $action)); } } }