From a496e82bd47cf0819367fa92ecf5ad089944cba0 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sat, 10 Dec 2022 19:47:00 +0330 Subject: [PATCH 01/12] add `compileRenameColumn` to DB grammar classes --- .../Database/Schema/Grammars/Grammar.php | 2 +- .../Database/Schema/Grammars/MySqlGrammar.php | 19 ++++++++++++++++++ .../Schema/Grammars/PostgresGrammar.php | 20 +++++++++++++++++++ .../Schema/Grammars/SQLiteGrammar.php | 19 ++++++++++++++++++ .../Schema/Grammars/SqlServerGrammar.php | 19 ++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Grammars/Grammar.php b/src/Illuminate/Database/Schema/Grammars/Grammar.php index d446dd7dfbc7..ea8333e40436 100755 --- a/src/Illuminate/Database/Schema/Grammars/Grammar.php +++ b/src/Illuminate/Database/Schema/Grammars/Grammar.php @@ -64,7 +64,7 @@ public function compileDropDatabaseIfExists($name) * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @param \Illuminate\Database\Connection $connection - * @return array + * @return array|string */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index c5259e1005f0..1355aa0a73a7 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -203,6 +203,25 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) })->all(); } + /** + * Compile a rename column command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @param \Illuminate\Database\Connection $connection + * @return array|string + */ + public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + { + return $connection->isDoctrineAvailable() + ? parent::compileRenameColumn($blueprint, $command, $connection) + : sprintf('alter table %s rename column %s to %s', + $this->wrapTable($blueprint), + $this->wrap($command->from), + $this->wrap($command->to) + ); + } + /** * Compile a primary key command. * diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index f425feb0fdda..30ce734655b8 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -2,6 +2,7 @@ namespace Illuminate\Database\Schema\Grammars; +use Illuminate\Database\Connection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Fluent; @@ -129,6 +130,25 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) })->all(); } + /** + * Compile a rename column command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @param \Illuminate\Database\Connection $connection + * @return array|string + */ + public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + { + return $connection->isDoctrineAvailable() + ? parent::compileRenameColumn($blueprint, $command, $connection) + : sprintf('alter table %s rename column %s to %s', + $this->wrapTable($blueprint), + $this->wrap($command->from), + $this->wrap($command->to) + ); + } + /** * Compile a primary key command. * diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 9bb6fd8fa0f4..13bd107c5e1a 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -144,6 +144,25 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) })->all(); } + /** + * Compile a rename column command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @param \Illuminate\Database\Connection $connection + * @return array|string + */ + public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + { + return $connection->isDoctrineAvailable() + ? parent::compileRenameColumn($blueprint, $command, $connection) + : sprintf('alter table %s rename column %s to %s', + $this->wrapTable($blueprint), + $this->wrap($command->from), + $this->wrap($command->to) + ); + } + /** * Compile a unique key command. * diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index 5121d782efe3..c1641420dd3b 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -2,6 +2,7 @@ namespace Illuminate\Database\Schema\Grammars; +use Illuminate\Database\Connection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Fluent; @@ -107,6 +108,24 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) ); } + /** + * Compile a rename column command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @param \Illuminate\Database\Connection $connection + * @return array|string + */ + public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + { + return $connection->isDoctrineAvailable() + ? parent::compileRenameColumn($blueprint, $command, $connection) + : sprintf("sp_rename '%s', %s, 'COLUMN'", + $this->wrap($blueprint->getTable().'.'.$command->from), + $this->wrap($command->to) + ); + } + /** * Compile a primary key command. * From 81048ec88c8a19823b1bd3d7972f253e2c3b5135 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 00:00:57 +0330 Subject: [PATCH 02/12] add tests --- src/Illuminate/Database/Connection.php | 10 +++++++ .../Database/Schema/Grammars/MySqlGrammar.php | 2 +- .../Schema/Grammars/PostgresGrammar.php | 2 +- .../Schema/Grammars/SQLiteGrammar.php | 2 +- .../Schema/Grammars/SqlServerGrammar.php | 2 +- .../Database/DatabaseSchemaBlueprintTest.php | 22 ++++++++++++++ .../DatabaseSchemaRenameColumnTest.php | 30 +++++++++++++++++++ 7 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 tests/Integration/Database/DatabaseSchemaRenameColumnTest.php diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index b1c4c99360c3..4f6fbb3c94b3 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1076,6 +1076,16 @@ public function isDoctrineAvailable() return class_exists('Doctrine\DBAL\Connection'); } + /** + * Indicates whether Doctrine should be used to rename column. + * + * @return bool + */ + public function shouldUseDoctrineToRenameColumn() + { + return $this->isDoctrineAvailable() && config('database.dbal.rename_column', true); + } + /** * Get a Doctrine Schema Column instance. * diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 1355aa0a73a7..1df741a4d62f 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -213,7 +213,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->isDoctrineAvailable() + return $connection->shouldUseDoctrineToRenameColumn() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 30ce734655b8..5a566c0fc0de 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -140,7 +140,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->isDoctrineAvailable() + return $connection->shouldUseDoctrineToRenameColumn() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 13bd107c5e1a..a083c84cd98e 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -154,7 +154,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->isDoctrineAvailable() + return $connection->shouldUseDoctrineToRenameColumn() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index c1641420dd3b..968020d8f270 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -118,7 +118,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->isDoctrineAvailable() + return $connection->shouldUseDoctrineToRenameColumn() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf("sp_rename '%s', %s, 'COLUMN'", $this->wrap($blueprint->getTable().'.'.$command->from), diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 9aaa92bb8d34..5d0bbd13ba5d 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -173,6 +173,28 @@ public function testRemoveColumn() $this->assertEquals(['alter table `users` add `foo` varchar(255) not null'], $blueprint->toSql($connection, new MySqlGrammar)); } + public function testRenameColumnWithoutDoctrine() + { + $base = new Blueprint('users', function ($table) { + $table->renameColumn('foo', 'bar'); + }); + + $connection = m::mock(Connection::class); + $connection->shouldReceive('shouldUseDoctrineToRenameColumn')->andReturn(false); + + $blueprint = clone $base; + $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new PostgresGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new SQLiteGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['sp_rename \'"users"."foo"\', "bar", \'COLUMN\''], $blueprint->toSql($connection, new SqlServerGrammar)); + } + public function testMacroable() { Blueprint::macro('foo', function () { diff --git a/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php b/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php new file mode 100644 index 000000000000..ca5825ddb703 --- /dev/null +++ b/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php @@ -0,0 +1,30 @@ +string('foo'); + }); + + Schema::table('test', function (Blueprint $table) { + $table->renameColumn('foo', 'bar'); + }); + + $this->assertFalse(Schema::hasColumn('test', 'foo')); + $this->assertTrue(Schema::hasColumn('test', 'bar')); + } +} From 50e09b461cf1170f12efdc733f473f9c63cd9773 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 03:03:54 +0330 Subject: [PATCH 03/12] add a static property to schema builder --- src/Illuminate/Database/Connection.php | 5 +-- src/Illuminate/Database/Schema/Builder.php | 18 ++++++++++ .../Database/Schema/Grammars/MySqlGrammar.php | 2 +- .../Schema/Grammars/PostgresGrammar.php | 2 +- .../Schema/Grammars/SQLiteGrammar.php | 2 +- .../Schema/Grammars/SqlServerGrammar.php | 2 +- src/Illuminate/Support/Facades/Schema.php | 1 + ...DatabaseSchemaBlueprintIntegrationTest.php | 35 +++++++++++++++++++ .../Database/DatabaseSchemaBlueprintTest.php | 2 +- .../DatabaseSchemaRenameColumnTest.php | 30 ---------------- 10 files changed, 62 insertions(+), 37 deletions(-) delete mode 100644 tests/Integration/Database/DatabaseSchemaRenameColumnTest.php diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 4f6fbb3c94b3..b5ed08c3542a 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1081,9 +1081,10 @@ public function isDoctrineAvailable() * * @return bool */ - public function shouldUseDoctrineToRenameColumn() + public function usesDoctrineToRenameColumns() { - return $this->isDoctrineAvailable() && config('database.dbal.rename_column', true); + return $this->isDoctrineAvailable() + && $this->getSchemaBuilder()::$usesDoctrineToRenameColumns; } /** diff --git a/src/Illuminate/Database/Schema/Builder.php b/src/Illuminate/Database/Schema/Builder.php index 176432c33a97..843ec1046ea1 100755 --- a/src/Illuminate/Database/Schema/Builder.php +++ b/src/Illuminate/Database/Schema/Builder.php @@ -45,6 +45,13 @@ class Builder */ public static $defaultMorphKeyType = 'int'; + /** + * Indicates whether Doctrine should be used to rename columns. + * + * @var bool + */ + public static $usesDoctrineToRenameColumns = true; + /** * Create a new database Schema manager. * @@ -105,6 +112,17 @@ public static function morphUsingUlids() return static::defaultMorphKeyType('ulid'); } + /** + * Use Doctrine to rename columns. + * + * @param bool $value + * @return void + */ + public static function useDoctrineToRenameColumns(bool $value = true) + { + static::$usesDoctrineToRenameColumns = $value; + } + /** * Create a database in the schema. * diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 1df741a4d62f..0a464e729c9f 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -213,7 +213,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->shouldUseDoctrineToRenameColumn() + return $connection->usesDoctrineToRenameColumns() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 5a566c0fc0de..736bb464d6b3 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -140,7 +140,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->shouldUseDoctrineToRenameColumn() + return $connection->usesDoctrineToRenameColumns() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index a083c84cd98e..8db342d4a566 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -154,7 +154,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->shouldUseDoctrineToRenameColumn() + return $connection->usesDoctrineToRenameColumns() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index 968020d8f270..ffc2e657535e 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -118,7 +118,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->shouldUseDoctrineToRenameColumn() + return $connection->usesDoctrineToRenameColumns() ? parent::compileRenameColumn($blueprint, $command, $connection) : sprintf("sp_rename '%s', %s, 'COLUMN'", $this->wrap($blueprint->getTable().'.'.$command->from), diff --git a/src/Illuminate/Support/Facades/Schema.php b/src/Illuminate/Support/Facades/Schema.php index 747e93818955..5d273e129776 100755 --- a/src/Illuminate/Support/Facades/Schema.php +++ b/src/Illuminate/Support/Facades/Schema.php @@ -7,6 +7,7 @@ * @method static void defaultMorphKeyType(string $type) * @method static void morphUsingUuids() * @method static void morphUsingUlids() + * @method static void useDoctrineToRenameColumns(bool $value = true) * @method static bool createDatabase(string $name) * @method static bool dropDatabaseIfExists(string $name) * @method static bool hasTable(string $table) diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index 32f883627f5d..d42b3aafc89a 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -101,6 +101,41 @@ public function testRenamingAndChangingColumnsWork() $this->assertContains($queries, $expected); } + public function testRenamingColumnWithoutDoctrineWorks() + { + $connection = $this->db->connection(); + $schema = $connection->getSchemaBuilder(); + + $schema::useDoctrineToRenameColumns(false); + + $base = new Blueprint('users', function ($table) { + $table->renameColumn('foo', 'bar'); + }); + + $blueprint = clone $base; + $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new PostgresGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new SQLiteGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['sp_rename \'"users"."foo"\', "bar", \'COLUMN\''], $blueprint->toSql($connection, new SqlServerGrammar)); + + $schema->create('test', function (Blueprint $table) { + $table->string('foo'); + }); + + $schema->table('test', function (Blueprint $table) { + $table->renameColumn('foo', 'bar'); + }); + + $this->assertFalse($schema->hasColumn('test', 'foo')); + $this->assertTrue($schema->hasColumn('test', 'bar')); + } + public function testChangingColumnWithCollationWorks() { $this->db->connection()->getSchemaBuilder()->create('users', function ($table) { diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 5d0bbd13ba5d..9e7c2f7fc2da 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -180,7 +180,7 @@ public function testRenameColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('shouldUseDoctrineToRenameColumn')->andReturn(false); + $connection->shouldReceive('usesDoctrineToRenameColumns')->andReturn(false); $blueprint = clone $base; $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); diff --git a/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php b/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php deleted file mode 100644 index ca5825ddb703..000000000000 --- a/tests/Integration/Database/DatabaseSchemaRenameColumnTest.php +++ /dev/null @@ -1,30 +0,0 @@ -string('foo'); - }); - - Schema::table('test', function (Blueprint $table) { - $table->renameColumn('foo', 'bar'); - }); - - $this->assertFalse(Schema::hasColumn('test', 'foo')); - $this->assertTrue(Schema::hasColumn('test', 'bar')); - } -} From e0fb220f7ffd8d3d3b437baa94106102c2591d84 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 05:22:24 +0330 Subject: [PATCH 04/12] add native drop column for SQLite --- src/Illuminate/Database/Connection.php | 15 +++- src/Illuminate/Database/Schema/Blueprint.php | 8 +- src/Illuminate/Database/Schema/Builder.php | 18 +++++ .../Schema/Grammars/SQLiteGrammar.php | 27 ++++--- src/Illuminate/Support/Facades/Schema.php | 1 + ...DatabaseSchemaBlueprintIntegrationTest.php | 75 +++++++++++++++++-- .../Database/DatabaseSchemaBlueprintTest.php | 22 ++++++ 7 files changed, 146 insertions(+), 20 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index b5ed08c3542a..06dfd2dd0ca9 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1077,14 +1077,25 @@ public function isDoctrineAvailable() } /** - * Indicates whether Doctrine should be used to rename column. + * Indicates whether Doctrine should be used to rename columns. * * @return bool */ public function usesDoctrineToRenameColumns() { return $this->isDoctrineAvailable() - && $this->getSchemaBuilder()::$usesDoctrineToRenameColumns; + && SchemaBuilder::$usesDoctrineToRenameColumns; + } + + /** + * Indicates whether Doctrine should be used to drop columns. + * + * @return bool + */ + public function usesDoctrineToDropColumns() + { + return $this->isDoctrineAvailable() + && SchemaBuilder::$usesDoctrineToDropColumns; } /** diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index e3ab9a11ba20..a476e85e0220 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -152,7 +152,13 @@ public function toSql(Connection $connection, Grammar $grammar) protected function ensureCommandsAreValid(Connection $connection) { if ($connection instanceof SQLiteConnection) { - if ($this->commandsNamed(['dropColumn', 'renameColumn'])->count() > 1) { + $dropColumnCommandsCount = $this->commandsNamed(['dropColumn'])->count(); + $renameColumnCommandsCount = $this->commandsNamed(['renameColumn'])->count(); + + if (($dropColumnCommandsCount && $renameColumnCommandsCount + && ($connection->usesDoctrineToDropColumns() || $connection->usesDoctrineToRenameColumns())) + || ($dropColumnCommandsCount > 1 && $connection->usesDoctrineToDropColumns()) + || ($renameColumnCommandsCount > 1 && $connection->usesDoctrineToRenameColumns())) { throw new BadMethodCallException( "SQLite doesn't support multiple calls to dropColumn / renameColumn in a single modification." ); diff --git a/src/Illuminate/Database/Schema/Builder.php b/src/Illuminate/Database/Schema/Builder.php index 843ec1046ea1..e040a22d4ae6 100755 --- a/src/Illuminate/Database/Schema/Builder.php +++ b/src/Illuminate/Database/Schema/Builder.php @@ -52,6 +52,13 @@ class Builder */ public static $usesDoctrineToRenameColumns = true; + /** + * Indicates whether Doctrine should be used to drop columns. + * + * @var bool + */ + public static $usesDoctrineToDropColumns = true; + /** * Create a new database Schema manager. * @@ -123,6 +130,17 @@ public static function useDoctrineToRenameColumns(bool $value = true) static::$usesDoctrineToRenameColumns = $value; } + /** + * Use Doctrine to rename columns. + * + * @param bool $value + * @return void + */ + public static function useDoctrineToDropColumns(bool $value = true) + { + static::$usesDoctrineToDropColumns = $value; + } + /** * Create a database in the schema. * diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 8db342d4a566..e0a778d9be06 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -305,17 +305,26 @@ public function compileRebuild() */ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - $tableDiff = $this->getDoctrineTableDiff( - $blueprint, $schema = $connection->getDoctrineSchemaManager() - ); - - foreach ($command->columns as $name) { - $tableDiff->removedColumns[$name] = $connection->getDoctrineColumn( - $this->getTablePrefix().$blueprint->getTable(), $name + if ($connection->usesDoctrineToDropColumns()) { + $tableDiff = $this->getDoctrineTableDiff( + $blueprint, $schema = $connection->getDoctrineSchemaManager() ); - } - return (array) $schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); + foreach ($command->columns as $name) { + $tableDiff->removedColumns[$name] = $connection->getDoctrineColumn( + $this->getTablePrefix() . $blueprint->getTable(), $name + ); + } + + return (array)$schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); + } else { + $table = $this->wrapTable($blueprint); + $columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); + + return collect($columns)->map(function ($column) use ($table) { + return "alter table $table $column"; + })->all(); + } } /** diff --git a/src/Illuminate/Support/Facades/Schema.php b/src/Illuminate/Support/Facades/Schema.php index 5d273e129776..bcd41e259402 100755 --- a/src/Illuminate/Support/Facades/Schema.php +++ b/src/Illuminate/Support/Facades/Schema.php @@ -8,6 +8,7 @@ * @method static void morphUsingUuids() * @method static void morphUsingUlids() * @method static void useDoctrineToRenameColumns(bool $value = true) + * @method static void useDoctrineToDropColumns(bool $value = true) * @method static bool createDatabase(string $name) * @method static bool dropDatabaseIfExists(string $name) * @method static bool hasTable(string $table) diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index d42b3aafc89a..7e1517680181 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -42,6 +42,8 @@ protected function tearDown(): void { Facade::clearResolvedInstances(); Facade::setFacadeApplication(null); + $this->db->connection()->getSchemaBuilder()->useDoctrineToRenameColumns(true); + $this->db->connection()->getSchemaBuilder()->useDoctrineToDropColumns(true); } public function testRenamingAndChangingColumnsWork() @@ -101,39 +103,96 @@ public function testRenamingAndChangingColumnsWork() $this->assertContains($queries, $expected); } - public function testRenamingColumnWithoutDoctrineWorks() + public function testRenamingColumnsWithoutDoctrineWorks() { $connection = $this->db->connection(); $schema = $connection->getSchemaBuilder(); - $schema::useDoctrineToRenameColumns(false); + $schema->useDoctrineToRenameColumns(false); $base = new Blueprint('users', function ($table) { - $table->renameColumn('foo', 'bar'); + $table->renameColumn('name', 'new_name'); }); $blueprint = clone $base; - $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); + $this->assertEquals(['alter table `users` rename column `name` to `new_name`'], $blueprint->toSql($connection, new MySqlGrammar)); $blueprint = clone $base; - $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new PostgresGrammar)); + $this->assertEquals(['alter table "users" rename column "name" to "new_name"'], $blueprint->toSql($connection, new PostgresGrammar)); $blueprint = clone $base; - $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $blueprint->toSql($connection, new SQLiteGrammar)); + $this->assertEquals(['alter table "users" rename column "name" to "new_name"'], $blueprint->toSql($connection, new SQLiteGrammar)); $blueprint = clone $base; - $this->assertEquals(['sp_rename \'"users"."foo"\', "bar", \'COLUMN\''], $blueprint->toSql($connection, new SqlServerGrammar)); + $this->assertEquals(['sp_rename \'"users"."name"\', "new_name", \'COLUMN\''], $blueprint->toSql($connection, new SqlServerGrammar)); $schema->create('test', function (Blueprint $table) { $table->string('foo'); + $table->string('baz'); }); $schema->table('test', function (Blueprint $table) { $table->renameColumn('foo', 'bar'); + $table->renameColumn('baz', 'qux'); + }); + + $this->assertFalse($schema->hasColumn('test', 'foo')); + $this->assertFalse($schema->hasColumn('test', 'baz')); + $this->assertTrue($schema->hasColumns('test', ['bar', 'qux'])); + } + + public function testDroppingColumnsWithoutDoctrineWorks() + { + $connection = $this->db->connection(); + $schema = $connection->getSchemaBuilder(); + + $schema->useDoctrineToDropColumns(false); + + $blueprint = new Blueprint('users', function ($table) { + $table->dropColumn('name'); + }); + + $this->assertEquals(['alter table "users" drop "name"'], $blueprint->toSql($connection, new SQLiteGrammar)); + + $schema->create('test', function (Blueprint $table) { + $table->string('foo'); + $table->string('bar'); + $table->string('baz'); + $table->string('qux'); + }); + + $schema->table('test', function (Blueprint $table) { + $table->dropColumn(['foo', 'bar']); + $table->dropColumn('qux'); + }); + + $this->assertFalse($schema->hasColumn('test', 'foo')); + $this->assertFalse($schema->hasColumn('test', 'bar')); + $this->assertFalse($schema->hasColumn('test', 'qux')); + $this->assertTrue($schema->hasColumn('test', 'baz')); + } + + public function testRenamingAndDroppingMultipleColumnsWithoutDoctrineWorks() + { + $connection = $this->db->connection(); + $schema = $connection->getSchemaBuilder(); + + $schema->useDoctrineToDropColumns(false); + $schema->useDoctrineToRenameColumns(false); + + $schema->create('test', function (Blueprint $table) { + $table->string('foo'); + $table->string('bar'); + }); + + $schema->table('test', function (Blueprint $table) { + $table->dropColumn('foo'); + $table->renameColumn('bar', 'baz'); }); $this->assertFalse($schema->hasColumn('test', 'foo')); - $this->assertTrue($schema->hasColumn('test', 'bar')); + $this->assertFalse($schema->hasColumn('test', 'bar')); + $this->assertTrue($schema->hasColumn('test', 'baz')); } public function testChangingColumnWithCollationWorks() diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 9e7c2f7fc2da..4c67f5ee0f22 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -195,6 +195,28 @@ public function testRenameColumnWithoutDoctrine() $this->assertEquals(['sp_rename \'"users"."foo"\', "bar", \'COLUMN\''], $blueprint->toSql($connection, new SqlServerGrammar)); } + public function testDropColumnWithoutDoctrine() + { + $base = new Blueprint('users', function ($table) { + $table->dropColumn('foo'); + }); + + $connection = m::mock(Connection::class); + $connection->shouldReceive('usesDoctrineToDropColumns')->andReturn(false); + + $blueprint = clone $base; + $this->assertEquals(['alter table `users` drop `foo`'], $blueprint->toSql($connection, new MySqlGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" drop column "foo"'], $blueprint->toSql($connection, new PostgresGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['alter table "users" drop "foo"'], $blueprint->toSql($connection, new SQLiteGrammar)); + + $blueprint = clone $base; + $this->assertEquals(['DECLARE @sql NVARCHAR(MAX) = \'\';SELECT @sql += \'ALTER TABLE [dbo].[users] DROP CONSTRAINT \' + OBJECT_NAME([default_object_id]) + \';\' FROM sys.columns WHERE [object_id] = OBJECT_ID(\'[dbo].[users]\') AND [name] in (\'foo\') AND [default_object_id] <> 0;EXEC(@sql);alter table "users" drop column "foo"'], $blueprint->toSql($connection, new SqlServerGrammar)); + } + public function testMacroable() { Blueprint::macro('foo', function () { From 3c200228357c2cabd7f2805090f9576bd18b9191 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 05:38:12 +0330 Subject: [PATCH 05/12] formatting --- src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index e0a778d9be06..2c089a3b10cb 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -312,17 +312,17 @@ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connect foreach ($command->columns as $name) { $tableDiff->removedColumns[$name] = $connection->getDoctrineColumn( - $this->getTablePrefix() . $blueprint->getTable(), $name + $this->getTablePrefix().$blueprint->getTable(), $name ); } - return (array)$schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); + return (array) $schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); } else { $table = $this->wrapTable($blueprint); $columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); return collect($columns)->map(function ($column) use ($table) { - return "alter table $table $column"; + return 'alter table '.$table.' '.$column; })->all(); } } From d2c99e66961cafa130fcea4b12f012f307436acb Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 06:05:53 +0330 Subject: [PATCH 06/12] add the optional column keyword to drop command --- src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php | 2 +- tests/Database/DatabaseSchemaBlueprintIntegrationTest.php | 2 +- tests/Database/DatabaseSchemaBlueprintTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 2c089a3b10cb..2e48a3a22dd9 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -319,7 +319,7 @@ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connect return (array) $schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); } else { $table = $this->wrapTable($blueprint); - $columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); + $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); return collect($columns)->map(function ($column) use ($table) { return 'alter table '.$table.' '.$column; diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index 7e1517680181..be358f0c6dbf 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -152,7 +152,7 @@ public function testDroppingColumnsWithoutDoctrineWorks() $table->dropColumn('name'); }); - $this->assertEquals(['alter table "users" drop "name"'], $blueprint->toSql($connection, new SQLiteGrammar)); + $this->assertEquals(['alter table "users" drop column "name"'], $blueprint->toSql($connection, new SQLiteGrammar)); $schema->create('test', function (Blueprint $table) { $table->string('foo'); diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 4c67f5ee0f22..65858114e56d 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -211,7 +211,7 @@ public function testDropColumnWithoutDoctrine() $this->assertEquals(['alter table "users" drop column "foo"'], $blueprint->toSql($connection, new PostgresGrammar)); $blueprint = clone $base; - $this->assertEquals(['alter table "users" drop "foo"'], $blueprint->toSql($connection, new SQLiteGrammar)); + $this->assertEquals(['alter table "users" drop column "foo"'], $blueprint->toSql($connection, new SQLiteGrammar)); $blueprint = clone $base; $this->assertEquals(['DECLARE @sql NVARCHAR(MAX) = \'\';SELECT @sql += \'ALTER TABLE [dbo].[users] DROP CONSTRAINT \' + OBJECT_NAME([default_object_id]) + \';\' FROM sys.columns WHERE [object_id] = OBJECT_ID(\'[dbo].[users]\') AND [name] in (\'foo\') AND [default_object_id] <> 0;EXEC(@sql);alter table "users" drop column "foo"'], $blueprint->toSql($connection, new SqlServerGrammar)); From 418984e551ee42ebd37fd5a5ade09bdaa15031f8 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Sun, 11 Dec 2022 06:44:16 +0330 Subject: [PATCH 07/12] fix php 8.0 windows tests --- ...DatabaseSchemaBlueprintIntegrationTest.php | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index be358f0c6dbf..898cb8b29229 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -153,46 +153,6 @@ public function testDroppingColumnsWithoutDoctrineWorks() }); $this->assertEquals(['alter table "users" drop column "name"'], $blueprint->toSql($connection, new SQLiteGrammar)); - - $schema->create('test', function (Blueprint $table) { - $table->string('foo'); - $table->string('bar'); - $table->string('baz'); - $table->string('qux'); - }); - - $schema->table('test', function (Blueprint $table) { - $table->dropColumn(['foo', 'bar']); - $table->dropColumn('qux'); - }); - - $this->assertFalse($schema->hasColumn('test', 'foo')); - $this->assertFalse($schema->hasColumn('test', 'bar')); - $this->assertFalse($schema->hasColumn('test', 'qux')); - $this->assertTrue($schema->hasColumn('test', 'baz')); - } - - public function testRenamingAndDroppingMultipleColumnsWithoutDoctrineWorks() - { - $connection = $this->db->connection(); - $schema = $connection->getSchemaBuilder(); - - $schema->useDoctrineToDropColumns(false); - $schema->useDoctrineToRenameColumns(false); - - $schema->create('test', function (Blueprint $table) { - $table->string('foo'); - $table->string('bar'); - }); - - $schema->table('test', function (Blueprint $table) { - $table->dropColumn('foo'); - $table->renameColumn('bar', 'baz'); - }); - - $this->assertFalse($schema->hasColumn('test', 'foo')); - $this->assertFalse($schema->hasColumn('test', 'bar')); - $this->assertTrue($schema->hasColumn('test', 'baz')); } public function testChangingColumnWithCollationWorks() From 6f36c3b00890999296de313d57356107f99b606d Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Mon, 12 Dec 2022 15:28:56 +0330 Subject: [PATCH 08/12] merge previously added schema methods into one --- src/Illuminate/Database/Connection.php | 19 +++---------- src/Illuminate/Database/Schema/Blueprint.php | 9 ++---- src/Illuminate/Database/Schema/Builder.php | 28 ++++--------------- .../Database/Schema/Grammars/MySqlGrammar.php | 8 +++--- .../Schema/Grammars/PostgresGrammar.php | 8 +++--- .../Schema/Grammars/SQLiteGrammar.php | 24 ++++++++-------- .../Schema/Grammars/SqlServerGrammar.php | 8 +++--- src/Illuminate/Support/Facades/Schema.php | 3 +- ...DatabaseSchemaBlueprintIntegrationTest.php | 7 ++--- .../Database/DatabaseSchemaBlueprintTest.php | 4 +-- 10 files changed, 41 insertions(+), 77 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 06dfd2dd0ca9..1b74e9c4be3c 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1077,25 +1077,14 @@ public function isDoctrineAvailable() } /** - * Indicates whether Doctrine should be used to rename columns. + * Indicates whether Doctrine will be prevented on schema if possible. * * @return bool */ - public function usesDoctrineToRenameColumns() + public function preventsDoctrineOnSchemaIfPossible() { - return $this->isDoctrineAvailable() - && SchemaBuilder::$usesDoctrineToRenameColumns; - } - - /** - * Indicates whether Doctrine should be used to drop columns. - * - * @return bool - */ - public function usesDoctrineToDropColumns() - { - return $this->isDoctrineAvailable() - && SchemaBuilder::$usesDoctrineToDropColumns; + return ! $this->isDoctrineAvailable() + || SchemaBuilder::$preventsDoctrineUsageIfPossible; } /** diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index a476e85e0220..c465e579c826 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -152,13 +152,8 @@ public function toSql(Connection $connection, Grammar $grammar) protected function ensureCommandsAreValid(Connection $connection) { if ($connection instanceof SQLiteConnection) { - $dropColumnCommandsCount = $this->commandsNamed(['dropColumn'])->count(); - $renameColumnCommandsCount = $this->commandsNamed(['renameColumn'])->count(); - - if (($dropColumnCommandsCount && $renameColumnCommandsCount - && ($connection->usesDoctrineToDropColumns() || $connection->usesDoctrineToRenameColumns())) - || ($dropColumnCommandsCount > 1 && $connection->usesDoctrineToDropColumns()) - || ($renameColumnCommandsCount > 1 && $connection->usesDoctrineToRenameColumns())) { + if ($this->commandsNamed(['dropColumn', 'renameColumn'])->count() > 1 + && ! $connection->preventsDoctrineOnSchemaIfPossible()) { throw new BadMethodCallException( "SQLite doesn't support multiple calls to dropColumn / renameColumn in a single modification." ); diff --git a/src/Illuminate/Database/Schema/Builder.php b/src/Illuminate/Database/Schema/Builder.php index e040a22d4ae6..1d4e7d97dd21 100755 --- a/src/Illuminate/Database/Schema/Builder.php +++ b/src/Illuminate/Database/Schema/Builder.php @@ -46,18 +46,11 @@ class Builder public static $defaultMorphKeyType = 'int'; /** - * Indicates whether Doctrine should be used to rename columns. + * Indicates whether Doctrine usage will be prevented if possible. * * @var bool */ - public static $usesDoctrineToRenameColumns = true; - - /** - * Indicates whether Doctrine should be used to drop columns. - * - * @var bool - */ - public static $usesDoctrineToDropColumns = true; + public static $preventsDoctrineUsageIfPossible = false; /** * Create a new database Schema manager. @@ -120,25 +113,14 @@ public static function morphUsingUlids() } /** - * Use Doctrine to rename columns. - * - * @param bool $value - * @return void - */ - public static function useDoctrineToRenameColumns(bool $value = true) - { - static::$usesDoctrineToRenameColumns = $value; - } - - /** - * Use Doctrine to rename columns. + * Prevent Doctrine usage when possible. * * @param bool $value * @return void */ - public static function useDoctrineToDropColumns(bool $value = true) + public static function preventDoctrineUsageIfPossible(bool $value = true) { - static::$usesDoctrineToDropColumns = $value; + static::$preventsDoctrineUsageIfPossible = $value; } /** diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 0a464e729c9f..cb599d69e492 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -213,13 +213,13 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->usesDoctrineToRenameColumns() - ? parent::compileRenameColumn($blueprint, $command, $connection) - : sprintf('alter table %s rename column %s to %s', + return $connection->preventsDoctrineOnSchemaIfPossible() + ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), $this->wrap($command->to) - ); + ) + : parent::compileRenameColumn($blueprint, $command, $connection); } /** diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 736bb464d6b3..985c71a04b10 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -140,13 +140,13 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->usesDoctrineToRenameColumns() - ? parent::compileRenameColumn($blueprint, $command, $connection) - : sprintf('alter table %s rename column %s to %s', + return $connection->preventsDoctrineOnSchemaIfPossible() + ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), $this->wrap($command->to) - ); + ) + : parent::compileRenameColumn($blueprint, $command, $connection); } /** diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 2e48a3a22dd9..8a2dc8cda55f 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -154,13 +154,13 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->usesDoctrineToRenameColumns() - ? parent::compileRenameColumn($blueprint, $command, $connection) - : sprintf('alter table %s rename column %s to %s', + return $connection->preventsDoctrineOnSchemaIfPossible() + ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), $this->wrap($command->to) - ); + ) + : parent::compileRenameColumn($blueprint, $command, $connection); } /** @@ -305,7 +305,14 @@ public function compileRebuild() */ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - if ($connection->usesDoctrineToDropColumns()) { + if ($connection->preventsDoctrineOnSchemaIfPossible()) { + $table = $this->wrapTable($blueprint); + $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); + + return collect($columns)->map(function ($column) use ($table) { + return 'alter table '.$table.' '.$column; + })->all(); + } else { $tableDiff = $this->getDoctrineTableDiff( $blueprint, $schema = $connection->getDoctrineSchemaManager() ); @@ -317,13 +324,6 @@ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connect } return (array) $schema->getDatabasePlatform()->getAlterTableSQL($tableDiff); - } else { - $table = $this->wrapTable($blueprint); - $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); - - return collect($columns)->map(function ($column) use ($table) { - return 'alter table '.$table.' '.$column; - })->all(); } } diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index ffc2e657535e..5e59856e9956 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -118,12 +118,12 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->usesDoctrineToRenameColumns() - ? parent::compileRenameColumn($blueprint, $command, $connection) - : sprintf("sp_rename '%s', %s, 'COLUMN'", + return $connection->preventsDoctrineOnSchemaIfPossible() + ? sprintf("sp_rename '%s', %s, 'COLUMN'", $this->wrap($blueprint->getTable().'.'.$command->from), $this->wrap($command->to) - ); + ) + : parent::compileRenameColumn($blueprint, $command, $connection); } /** diff --git a/src/Illuminate/Support/Facades/Schema.php b/src/Illuminate/Support/Facades/Schema.php index bcd41e259402..a9f854a2f74e 100755 --- a/src/Illuminate/Support/Facades/Schema.php +++ b/src/Illuminate/Support/Facades/Schema.php @@ -7,8 +7,7 @@ * @method static void defaultMorphKeyType(string $type) * @method static void morphUsingUuids() * @method static void morphUsingUlids() - * @method static void useDoctrineToRenameColumns(bool $value = true) - * @method static void useDoctrineToDropColumns(bool $value = true) + * @method static void preventDoctrineUsageIfPossible(bool $value = true) * @method static bool createDatabase(string $name) * @method static bool dropDatabaseIfExists(string $name) * @method static bool hasTable(string $table) diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index 898cb8b29229..8b254b79e84c 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -42,8 +42,7 @@ protected function tearDown(): void { Facade::clearResolvedInstances(); Facade::setFacadeApplication(null); - $this->db->connection()->getSchemaBuilder()->useDoctrineToRenameColumns(true); - $this->db->connection()->getSchemaBuilder()->useDoctrineToDropColumns(true); + $this->db->connection()->getSchemaBuilder()->preventDoctrineUsageIfPossible(false); } public function testRenamingAndChangingColumnsWork() @@ -108,7 +107,7 @@ public function testRenamingColumnsWithoutDoctrineWorks() $connection = $this->db->connection(); $schema = $connection->getSchemaBuilder(); - $schema->useDoctrineToRenameColumns(false); + $schema->preventDoctrineUsageIfPossible(); $base = new Blueprint('users', function ($table) { $table->renameColumn('name', 'new_name'); @@ -146,7 +145,7 @@ public function testDroppingColumnsWithoutDoctrineWorks() $connection = $this->db->connection(); $schema = $connection->getSchemaBuilder(); - $schema->useDoctrineToDropColumns(false); + $schema->preventDoctrineUsageIfPossible(); $blueprint = new Blueprint('users', function ($table) { $table->dropColumn('name'); diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 65858114e56d..57dd6f35132d 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -180,7 +180,7 @@ public function testRenameColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('usesDoctrineToRenameColumns')->andReturn(false); + $connection->shouldReceive('preventsDoctrineOnSchemaIfPossible')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); @@ -202,7 +202,7 @@ public function testDropColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('usesDoctrineToDropColumns')->andReturn(false); + $connection->shouldReceive('preventsDoctrineOnSchemaIfPossible')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` drop `foo`'], $blueprint->toSql($connection, new MySqlGrammar)); From a72b011f107a4ca4652715676b91c36157c27388 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Mon, 12 Dec 2022 17:26:35 +0330 Subject: [PATCH 09/12] better test --- tests/Database/DatabaseSchemaBlueprintTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 57dd6f35132d..adbe0de243c6 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -214,7 +214,7 @@ public function testDropColumnWithoutDoctrine() $this->assertEquals(['alter table "users" drop column "foo"'], $blueprint->toSql($connection, new SQLiteGrammar)); $blueprint = clone $base; - $this->assertEquals(['DECLARE @sql NVARCHAR(MAX) = \'\';SELECT @sql += \'ALTER TABLE [dbo].[users] DROP CONSTRAINT \' + OBJECT_NAME([default_object_id]) + \';\' FROM sys.columns WHERE [object_id] = OBJECT_ID(\'[dbo].[users]\') AND [name] in (\'foo\') AND [default_object_id] <> 0;EXEC(@sql);alter table "users" drop column "foo"'], $blueprint->toSql($connection, new SqlServerGrammar)); + $this->assertStringContainsString('alter table "users" drop column "foo"', $blueprint->toSql($connection, new SqlServerGrammar)[0]); } public function testMacroable() From a8354a982b1df0d688f8e2d59305bcb0d6c274f2 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 12 Dec 2022 11:29:42 -0600 Subject: [PATCH 10/12] formatting and renaming --- src/Illuminate/Database/Connection.php | 7 +++---- src/Illuminate/Database/Schema/Blueprint.php | 2 +- src/Illuminate/Database/Schema/Builder.php | 10 +++++----- .../Database/Schema/Grammars/MySqlGrammar.php | 2 +- .../Database/Schema/Grammars/PostgresGrammar.php | 2 +- .../Database/Schema/Grammars/SQLiteGrammar.php | 11 ++++++----- .../Database/Schema/Grammars/SqlServerGrammar.php | 2 +- src/Illuminate/Support/Facades/Schema.php | 2 +- .../DatabaseSchemaBlueprintIntegrationTest.php | 6 +++--- tests/Database/DatabaseSchemaBlueprintTest.php | 4 ++-- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 1b74e9c4be3c..7beb2b92afab 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1077,14 +1077,13 @@ public function isDoctrineAvailable() } /** - * Indicates whether Doctrine will be prevented on schema if possible. + * Indicates whether native alter operations will be used when dropping or renaming columns, even if Doctrine DBAL is installed. * * @return bool */ - public function preventsDoctrineOnSchemaIfPossible() + public function alwaysUsesNativeSchemaOperationsIfPossible() { - return ! $this->isDoctrineAvailable() - || SchemaBuilder::$preventsDoctrineUsageIfPossible; + return ! $this->isDoctrineAvailable() || SchemaBuilder::$alwaysUsesNativeSchemaOperationsIfPossible; } /** diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index c465e579c826..cfbbf35fd32f 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -153,7 +153,7 @@ protected function ensureCommandsAreValid(Connection $connection) { if ($connection instanceof SQLiteConnection) { if ($this->commandsNamed(['dropColumn', 'renameColumn'])->count() > 1 - && ! $connection->preventsDoctrineOnSchemaIfPossible()) { + && ! $connection->alwaysUsesNativeSchemaOperationsIfPossible()) { throw new BadMethodCallException( "SQLite doesn't support multiple calls to dropColumn / renameColumn in a single modification." ); diff --git a/src/Illuminate/Database/Schema/Builder.php b/src/Illuminate/Database/Schema/Builder.php index 1d4e7d97dd21..2788a124fdb5 100755 --- a/src/Illuminate/Database/Schema/Builder.php +++ b/src/Illuminate/Database/Schema/Builder.php @@ -46,11 +46,11 @@ class Builder public static $defaultMorphKeyType = 'int'; /** - * Indicates whether Doctrine usage will be prevented if possible. + * Indicates whether Doctrine DBAL usage will be prevented if possible when dropping and renaming columns. * * @var bool */ - public static $preventsDoctrineUsageIfPossible = false; + public static $alwaysUsesNativeSchemaOperationsIfPossible = false; /** * Create a new database Schema manager. @@ -113,14 +113,14 @@ public static function morphUsingUlids() } /** - * Prevent Doctrine usage when possible. + * Attempt to use native schema operations for dropping and renaming columns, even if Doctrine DBAL is installed. * * @param bool $value * @return void */ - public static function preventDoctrineUsageIfPossible(bool $value = true) + public static function useNativeSchemaOperationsIfPossible(bool $value = true) { - static::$preventsDoctrineUsageIfPossible = $value; + static::$alwaysUsesNativeSchemaOperationsIfPossible = $value; } /** diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index cb599d69e492..fe2f437876a0 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -213,7 +213,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->preventsDoctrineOnSchemaIfPossible() + return $connection->alwaysUsesNativeSchemaOperationsIfPossible() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 985c71a04b10..c286b335531a 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -140,7 +140,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->preventsDoctrineOnSchemaIfPossible() + return $connection->alwaysUsesNativeSchemaOperationsIfPossible() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 8a2dc8cda55f..028d5b775fcd 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -154,7 +154,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->preventsDoctrineOnSchemaIfPossible() + return $connection->alwaysUsesNativeSchemaOperationsIfPossible() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), @@ -305,13 +305,14 @@ public function compileRebuild() */ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - if ($connection->preventsDoctrineOnSchemaIfPossible()) { + if ($connection->alwaysUsesNativeSchemaOperationsIfPossible()) { $table = $this->wrapTable($blueprint); + $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); - return collect($columns)->map(function ($column) use ($table) { - return 'alter table '.$table.' '.$column; - })->all(); + return collect($columns)->map(fn ($column) => + 'alter table '.$table.' '.$column + )->all(); } else { $tableDiff = $this->getDoctrineTableDiff( $blueprint, $schema = $connection->getDoctrineSchemaManager() diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index 5e59856e9956..c4135855e68a 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -118,7 +118,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->preventsDoctrineOnSchemaIfPossible() + return $connection->alwaysUsesNativeSchemaOperationsIfPossible() ? sprintf("sp_rename '%s', %s, 'COLUMN'", $this->wrap($blueprint->getTable().'.'.$command->from), $this->wrap($command->to) diff --git a/src/Illuminate/Support/Facades/Schema.php b/src/Illuminate/Support/Facades/Schema.php index a9f854a2f74e..b1a89a427848 100755 --- a/src/Illuminate/Support/Facades/Schema.php +++ b/src/Illuminate/Support/Facades/Schema.php @@ -7,7 +7,7 @@ * @method static void defaultMorphKeyType(string $type) * @method static void morphUsingUuids() * @method static void morphUsingUlids() - * @method static void preventDoctrineUsageIfPossible(bool $value = true) + * @method static void useNativeSchemaOperationsIfPossible(bool $value = true) * @method static bool createDatabase(string $name) * @method static bool dropDatabaseIfExists(string $name) * @method static bool hasTable(string $table) diff --git a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php index 8b254b79e84c..b6b081496be4 100644 --- a/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php +++ b/tests/Database/DatabaseSchemaBlueprintIntegrationTest.php @@ -42,7 +42,7 @@ protected function tearDown(): void { Facade::clearResolvedInstances(); Facade::setFacadeApplication(null); - $this->db->connection()->getSchemaBuilder()->preventDoctrineUsageIfPossible(false); + $this->db->connection()->getSchemaBuilder()->useNativeSchemaOperationsIfPossible(false); } public function testRenamingAndChangingColumnsWork() @@ -107,7 +107,7 @@ public function testRenamingColumnsWithoutDoctrineWorks() $connection = $this->db->connection(); $schema = $connection->getSchemaBuilder(); - $schema->preventDoctrineUsageIfPossible(); + $schema->useNativeSchemaOperationsIfPossible(); $base = new Blueprint('users', function ($table) { $table->renameColumn('name', 'new_name'); @@ -145,7 +145,7 @@ public function testDroppingColumnsWithoutDoctrineWorks() $connection = $this->db->connection(); $schema = $connection->getSchemaBuilder(); - $schema->preventDoctrineUsageIfPossible(); + $schema->useNativeSchemaOperationsIfPossible(); $blueprint = new Blueprint('users', function ($table) { $table->dropColumn('name'); diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index adbe0de243c6..39d5ff480afb 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -180,7 +180,7 @@ public function testRenameColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('preventsDoctrineOnSchemaIfPossible')->andReturn(true); + $connection->shouldReceive('alwaysUsesNativeSchemaOperationsIfPossible')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); @@ -202,7 +202,7 @@ public function testDropColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('preventsDoctrineOnSchemaIfPossible')->andReturn(true); + $connection->shouldReceive('alwaysUsesNativeSchemaOperationsIfPossible')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` drop `foo`'], $blueprint->toSql($connection, new MySqlGrammar)); From 2ab5c35f9e5be096f217770334ce3a933d1d8745 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 12 Dec 2022 11:34:54 -0600 Subject: [PATCH 11/12] formatting --- src/Illuminate/Database/Connection.php | 2 +- src/Illuminate/Database/Schema/Blueprint.php | 2 +- src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php | 2 +- src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php | 2 +- src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php | 4 ++-- src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 7beb2b92afab..c4bcb723bf6b 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1081,7 +1081,7 @@ public function isDoctrineAvailable() * * @return bool */ - public function alwaysUsesNativeSchemaOperationsIfPossible() + public function usingNativeSchemaOperations() { return ! $this->isDoctrineAvailable() || SchemaBuilder::$alwaysUsesNativeSchemaOperationsIfPossible; } diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index cfbbf35fd32f..ee0988d5273a 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -153,7 +153,7 @@ protected function ensureCommandsAreValid(Connection $connection) { if ($connection instanceof SQLiteConnection) { if ($this->commandsNamed(['dropColumn', 'renameColumn'])->count() > 1 - && ! $connection->alwaysUsesNativeSchemaOperationsIfPossible()) { + && ! $connection->usingNativeSchemaOperations()) { throw new BadMethodCallException( "SQLite doesn't support multiple calls to dropColumn / renameColumn in a single modification." ); diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index fe2f437876a0..40ee3c8b873d 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -213,7 +213,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->alwaysUsesNativeSchemaOperationsIfPossible() + return $connection->usingNativeSchemaOperations() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index c286b335531a..ef60d0ff820f 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -140,7 +140,7 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->alwaysUsesNativeSchemaOperationsIfPossible() + return $connection->usingNativeSchemaOperations() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 028d5b775fcd..8c1dc24e772c 100755 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -154,7 +154,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->alwaysUsesNativeSchemaOperationsIfPossible() + return $connection->usingNativeSchemaOperations() ? sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), $this->wrap($command->from), @@ -305,7 +305,7 @@ public function compileRebuild() */ public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - if ($connection->alwaysUsesNativeSchemaOperationsIfPossible()) { + if ($connection->usingNativeSchemaOperations()) { $table = $this->wrapTable($blueprint); $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index c4135855e68a..4d7271ca3308 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -118,7 +118,7 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) */ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) { - return $connection->alwaysUsesNativeSchemaOperationsIfPossible() + return $connection->usingNativeSchemaOperations() ? sprintf("sp_rename '%s', %s, 'COLUMN'", $this->wrap($blueprint->getTable().'.'.$command->from), $this->wrap($command->to) From b885768c9f2ef422f9fbcecfe2cfbe36537c6d93 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 12 Dec 2022 11:40:12 -0600 Subject: [PATCH 12/12] fix tests --- tests/Database/DatabaseSchemaBlueprintTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index 39d5ff480afb..3e6ce17f5a43 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -180,7 +180,7 @@ public function testRenameColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('alwaysUsesNativeSchemaOperationsIfPossible')->andReturn(true); + $connection->shouldReceive('usingNativeSchemaOperations')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $blueprint->toSql($connection, new MySqlGrammar)); @@ -202,7 +202,7 @@ public function testDropColumnWithoutDoctrine() }); $connection = m::mock(Connection::class); - $connection->shouldReceive('alwaysUsesNativeSchemaOperationsIfPossible')->andReturn(true); + $connection->shouldReceive('usingNativeSchemaOperations')->andReturn(true); $blueprint = clone $base; $this->assertEquals(['alter table `users` drop `foo`'], $blueprint->toSql($connection, new MySqlGrammar));