*/ class TableDropCommand extends ContainerAwareCommand { use FormattingHelpers; /** * {@inheritdoc} */ protected function configure() { $this ->setName('propel:table:drop') ->setDescription('Drop a given table or all tables in the database.') ->addOption('connection', null, InputOption::VALUE_OPTIONAL, 'Connection to use. Example: default, bookstore') ->addOption('force', null, InputOption::VALUE_NONE, 'Set this parameter to execute this action.') ->addArgument('table', InputArgument::IS_ARRAY, 'Set this parameter to défine which table to delete (default all the table in the database.') ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $connection = Propel::getConnection($input->getOption('connection')); $adapter = Propel::getAdapter($connection->getName()); if (!$adapter instanceof MysqlAdapter) { return $output->writeln('This command is MySQL only.'); } if (!$input->getOption('force')) { return $output->writeln('You have to use the "--force" option to drop some tables.'); } $tablesToDelete = $input->getArgument('table'); $nbTable = count($tablesToDelete); $tablePlural = (($nbTable > 1 || $nbTable == 0) ? 's' : '' ); if ('prod' === $this->getApplication()->getKernel()->getEnvironment()) { $count = $nbTable ?: 'all'; $this->writeSection( $output, 'WARNING: you are about to drop ' . $count . ' table' . $tablePlural . ' in production !', 'bg=red;fg=white' ); if (false === $this->askConfirmation($output, 'Are you sure ? (y/n) ', false)) { $output->writeln('Aborted, nice decision !'); return -2; } } try { $showStatement = $connection->prepare('SHOW TABLES;'); $showStatement->execute(); $allTables = $showStatement->fetchAll(\PDO::FETCH_COLUMN); if ($nbTable) { foreach ($tablesToDelete as $tableToDelete) { if (!array_search($tableToDelete, $allTables)) { throw new \InvalidArgumentException(sprintf('Table %s doesn\'t exist in the database.', $tableToDelete)); } } } else { $tablesToDelete = $allTables; } $connection->exec('SET FOREIGN_KEY_CHECKS = 0;'); array_walk($tablesToDelete, function (&$table, $key, $dbAdapter) { $table = $dbAdapter->quoteIdentifierTable($table); }, $adapter); $tablesToDelete = join(', ', $tablesToDelete); if ('' !== $tablesToDelete) { $connection->exec('DROP TABLE ' . $tablesToDelete . ' ;'); $output->writeln(sprintf('Table' . $tablePlural . ' %s has been dropped.', $tablesToDelete)); } else { $output->writeln('No tables have been dropped'); } $connection->exec('SET FOREIGN_KEY_CHECKS = 1;'); } catch (\Exception $e) { $this->writeSection($output, array( '[Propel] Exception caught', '', $e->getMessage() ), 'fg=white;bg=red'); } } }