/** * @return string */ public function generateAlterScript() { $tableChanges = []; if ($this->deletedPrimaryKey || !empty($this->fromTable->getPrimaryKeys()) && !empty($this->changedPrimaryKeys)) { $tableChanges[] = 'DROP PRIMARY KEY'; } foreach ($this->deletedForeignKeys as $deletedForeignKey) { $tableChanges[] = sprintf('DROP FOREIGN KEY `%s`', $deletedForeignKey->getName()); } foreach ($this->changedForeignKeys as $changedForeignKey) { $tableChanges[] = sprintf('DROP FOREIGN KEY `%s`', $changedForeignKey->getName()); } foreach ($this->deletedIndexes as $deletedIndex) { $tableChanges[] = sprintf('DROP INDEX `%s`', $deletedIndex->getName()); } foreach ($this->changedIndexes as $changedIndex) { $tableChanges[] = sprintf('DROP INDEX `%s`', $changedIndex->getName()); } foreach ($this->deletedColumns as $deletedColumn) { $tableChanges[] = sprintf('DROP COLUMN `%s`', $deletedColumn->getName()); } $columnStatements = []; foreach ($this->changedColumns as $changedColumn) { $columnStatements[$changedColumn->getOrder()] = sprintf('CHANGE COLUMN `%s` %s %s', $changedColumn->getName(), $changedColumn->generateCreationScript(), $this->getAfterClause($changedColumn)); } foreach ($this->newColumns as $newColumn) { $columnStatements[$newColumn->getOrder()] = sprintf('ADD COLUMN %s %s', $newColumn->generateCreationScript(), $this->getAfterClause($newColumn)); } ksort($columnStatements); foreach ($columnStatements as $columnStatement) { $tableChanges[] = $columnStatement; } if (!empty($this->changedPrimaryKeys)) { $primaryKeyColumnNames = []; foreach ($this->changedPrimaryKeys as $primaryKeyColumn) { $primaryKeyColumnNames[] = sprintf('`%s`', $primaryKeyColumn->getName()); } $tableChanges[] = sprintf('ADD PRIMARY KEY (%s)', implode(',', $primaryKeyColumnNames)); } foreach ($this->changedIndexes as $changedIndex) { $tableChanges[] = sprintf('ADD %s', $changedIndex->generateCreationScript()); } foreach ($this->newIndexes as $newIndex) { $tableChanges[] = sprintf('ADD %s', $newIndex->generateCreationScript()); } foreach ($this->changedForeignKeys as $changedForeignKey) { $tableChanges[] = sprintf('ADD %s', $changedForeignKey->generateCreationScript()); } foreach ($this->newForeignKeys as $newForeignKey) { $tableChanges[] = sprintf('ADD %s', $newForeignKey->generateCreationScript()); } $alterScript = sprintf('ALTER TABLE `%s`%s %s;', $this->getName(), PHP_EOL, implode(',' . PHP_EOL . ' ', $tableChanges)); return $alterScript; }