1<?php 2 3namespace Illuminate\Database\Schema\Grammars; 4 5use Doctrine\DBAL\Schema\AbstractSchemaManager as SchemaManager; 6use Doctrine\DBAL\Schema\Column; 7use Doctrine\DBAL\Schema\TableDiff; 8use Illuminate\Database\Connection; 9use Illuminate\Database\Schema\Blueprint; 10use Illuminate\Support\Fluent; 11 12class RenameColumn 13{ 14 /** 15 * Compile a rename column command. 16 * 17 * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar 18 * @param \Illuminate\Database\Schema\Blueprint $blueprint 19 * @param \Illuminate\Support\Fluent $command 20 * @param \Illuminate\Database\Connection $connection 21 * @return array 22 */ 23 public static function compile(Grammar $grammar, Blueprint $blueprint, Fluent $command, Connection $connection) 24 { 25 $schema = $connection->getDoctrineSchemaManager(); 26 $databasePlatform = $schema->getDatabasePlatform(); 27 $databasePlatform->registerDoctrineTypeMapping('enum', 'string'); 28 29 $column = $connection->getDoctrineColumn( 30 $grammar->getTablePrefix().$blueprint->getTable(), $command->from 31 ); 32 33 return (array) $databasePlatform->getAlterTableSQL(static::getRenamedDiff( 34 $grammar, $blueprint, $command, $column, $schema 35 )); 36 } 37 38 /** 39 * Get a new column instance with the new column name. 40 * 41 * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar 42 * @param \Illuminate\Database\Schema\Blueprint $blueprint 43 * @param \Illuminate\Support\Fluent $command 44 * @param \Doctrine\DBAL\Schema\Column $column 45 * @param \Doctrine\DBAL\Schema\AbstractSchemaManager $schema 46 * @return \Doctrine\DBAL\Schema\TableDiff 47 */ 48 protected static function getRenamedDiff(Grammar $grammar, Blueprint $blueprint, Fluent $command, Column $column, SchemaManager $schema) 49 { 50 return static::setRenamedColumns( 51 $grammar->getDoctrineTableDiff($blueprint, $schema), $command, $column 52 ); 53 } 54 55 /** 56 * Set the renamed columns on the table diff. 57 * 58 * @param \Doctrine\DBAL\Schema\TableDiff $tableDiff 59 * @param \Illuminate\Support\Fluent $command 60 * @param \Doctrine\DBAL\Schema\Column $column 61 * @return \Doctrine\DBAL\Schema\TableDiff 62 */ 63 protected static function setRenamedColumns(TableDiff $tableDiff, Fluent $command, Column $column) 64 { 65 $tableDiff->renamedColumns = [ 66 $command->from => new Column($command->to, $column->getType(), self::getWritableColumnOptions($column)), 67 ]; 68 69 return $tableDiff; 70 } 71 72 /** 73 * Get the writable column options. 74 * 75 * @param \Doctrine\DBAL\Schema\Column $column 76 * @return array 77 */ 78 private static function getWritableColumnOptions(Column $column) 79 { 80 return array_filter($column->toArray(), function (string $name) use ($column) { 81 return method_exists($column, 'set'.$name); 82 }, ARRAY_FILTER_USE_KEY); 83 } 84} 85