setName('db:add-missing-indices') ->setDescription('Add missing indices to the database tables') ->addOption('dry-run', null, InputOption::VALUE_NONE, "Output the SQL queries instead of running them."); } protected function execute(InputInterface $input, OutputInterface $output): int { $dryRun = $input->getOption('dry-run'); // Dispatch event so apps can also update indexes if needed $event = new AddMissingIndicesEvent(); $this->dispatcher->dispatchTyped($event); $missingIndices = $event->getMissingIndices(); $toReplaceIndices = $event->getIndicesToReplace(); if ($missingIndices !== [] || $toReplaceIndices !== []) { $schema = new SchemaWrapper($this->connection); foreach ($missingIndices as $missingIndex) { if ($schema->hasTable($missingIndex['tableName'])) { $table = $schema->getTable($missingIndex['tableName']); if (!$table->hasIndex($missingIndex['indexName'])) { $output->writeln('Adding additional ' . $missingIndex['indexName'] . ' index to the ' . $table->getName() . ' table, this can take some time...'); if ($missingIndex['dropUnnamedIndex']) { foreach ($table->getIndexes() as $index) { $columns = $index->getColumns(); if ($columns === $missingIndex['columns']) { $table->dropIndex($index->getName()); } } } if ($missingIndex['uniqueIndex']) { $table->addUniqueIndex($missingIndex['columns'], $missingIndex['indexName'], $missingIndex['options']); } else { $table->addIndex($missingIndex['columns'], $missingIndex['indexName'], [], $missingIndex['options']); } if (!$dryRun) { $this->connection->migrateToSchema($schema->getWrappedSchema()); } $output->writeln('' . $table->getName() . ' table updated successfully.'); } } } foreach ($toReplaceIndices as $toReplaceIndex) { if ($schema->hasTable($toReplaceIndex['tableName'])) { $table = $schema->getTable($toReplaceIndex['tableName']); $allOldIndicesExists = true; foreach ($toReplaceIndex['oldIndexNames'] as $oldIndexName) { if (!$table->hasIndex($oldIndexName)) { $allOldIndicesExists = false; } } if (!$allOldIndicesExists) { continue; } $output->writeln('Adding additional ' . $toReplaceIndex['newIndexName'] . ' index to the ' . $table->getName() . ' table, this can take some time...'); if ($toReplaceIndex['uniqueIndex']) { $table->addUniqueIndex($toReplaceIndex['columns'], $toReplaceIndex['newIndexName'], $toReplaceIndex['options']); } else { $table->addIndex($toReplaceIndex['columns'], $toReplaceIndex['newIndexName'], [], $toReplaceIndex['options']); } if (!$dryRun) { $this->connection->migrateToSchema($schema->getWrappedSchema()); } foreach ($toReplaceIndex['oldIndexNames'] as $oldIndexName) { $output->writeln('Removing ' . $oldIndexName . ' index from the ' . $table->getName() . ' table'); $table->dropIndex($oldIndexName); } if (!$dryRun) { $this->connection->migrateToSchema($schema->getWrappedSchema()); } $output->writeln('' . $table->getName() . ' table updated successfully.'); } } if ($dryRun) { $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); if ($sqlQueries !== null) { $output->writeln($sqlQueries); } } } return 0; } }