From 2e5c6b9343fad2c3ae4e275e9df56df75ce7b384 Mon Sep 17 00:00:00 2001 From: Mohammad Altaweel Date: Thu, 14 Dec 2023 13:18:31 +0300 Subject: [PATCH 1/6] Fix inline primary key creation for MySQL --- .../Database/Schema/Grammars/MySqlGrammar.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 43875591e07f..1009627bb3e2 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -222,10 +222,19 @@ public function compileCreate(Blueprint $blueprint, Fluent $command, Connection */ protected function compileCreateTable($blueprint, $command, $connection) { + $tableStructure = $this->getColumns($blueprint); + + if ($primaryKey = $this->getCommandByName($blueprint, 'primary')) { + $tableStructure[] = $this->compilePrimary($blueprint, $primaryKey); + + // This to avoid altering the primary key again + unset($primaryKey['name']); + } + return sprintf('%s table %s (%s)', $blueprint->temporary ? 'create temporary' : 'create', $this->wrapTable($blueprint), - implode(', ', $this->getColumns($blueprint)) + implode(', ', $tableStructure) ); } @@ -368,6 +377,13 @@ public function compileChange(Blueprint $blueprint, Fluent $command, Connection */ public function compilePrimary(Blueprint $blueprint, Fluent $command) { + if ($blueprint->creating()) { + return sprintf('primary key %s(%s)', + $command->algorithm ? 'using ' . $command->algorithm : '', + $this->columnize($command->columns) + ); + } + return sprintf('alter table %s add primary key %s(%s)', $this->wrapTable($blueprint), $command->algorithm ? 'using '.$command->algorithm : '', From 49e0ca8d665083bb1aae91e97c714a691bc4f776 Mon Sep 17 00:00:00 2001 From: Mohammad Altaweel Date: Thu, 14 Dec 2023 13:28:37 +0300 Subject: [PATCH 2/6] Fix styleci issue --- src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 409ade8ddff9..f72753a8e420 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -405,7 +405,7 @@ public function compilePrimary(Blueprint $blueprint, Fluent $command) { if ($blueprint->creating()) { return sprintf('primary key %s(%s)', - $command->algorithm ? 'using ' . $command->algorithm : '', + $command->algorithm ? 'using '.$command->algorithm : '', $this->columnize($command->columns) ); } From 4994754e8ff908e840ac92eb72911aa3438e3bff Mon Sep 17 00:00:00 2001 From: Mohammad Altaweel Date: Thu, 14 Dec 2023 13:34:19 +0300 Subject: [PATCH 3/6] Correct comment sentence --- src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index f72753a8e420..9b3125e482f6 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -253,7 +253,7 @@ protected function compileCreateTable($blueprint, $command, $connection) if ($primaryKey = $this->getCommandByName($blueprint, 'primary')) { $tableStructure[] = $this->compilePrimary($blueprint, $primaryKey); - // This to avoid altering the primary key again + // Prevents redundant alteration of the primary key. unset($primaryKey['name']); } From 0c763c174df46408883ff0ef72c6e32f6e16366a Mon Sep 17 00:00:00 2001 From: Mohammad ALTAWEEL Date: Thu, 14 Dec 2023 17:42:50 +0300 Subject: [PATCH 4/6] Refactor --- .../Database/Schema/Grammars/MySqlGrammar.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 9b3125e482f6..83011c9e62cf 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -251,7 +251,10 @@ protected function compileCreateTable($blueprint, $command, $connection) $tableStructure = $this->getColumns($blueprint); if ($primaryKey = $this->getCommandByName($blueprint, 'primary')) { - $tableStructure[] = $this->compilePrimary($blueprint, $primaryKey); + $tableStructure[] = sprintf('primary key %s(%s)', + $primaryKey->algorithm ? 'using '.$primaryKey->algorithm : '', + $this->columnize($primaryKey->columns) + ); // Prevents redundant alteration of the primary key. unset($primaryKey['name']); @@ -403,13 +406,6 @@ public function compileChange(Blueprint $blueprint, Fluent $command, Connection */ public function compilePrimary(Blueprint $blueprint, Fluent $command) { - if ($blueprint->creating()) { - return sprintf('primary key %s(%s)', - $command->algorithm ? 'using '.$command->algorithm : '', - $this->columnize($command->columns) - ); - } - return sprintf('alter table %s add primary key %s(%s)', $this->wrapTable($blueprint), $command->algorithm ? 'using '.$command->algorithm : '', From 8abdac0102adf2c0c487b83b2f35844439937899 Mon Sep 17 00:00:00 2001 From: Mohammad Altaweel Date: Thu, 14 Dec 2023 20:53:27 +0300 Subject: [PATCH 5/6] Add tests --- tests/Database/DatabaseMySqlSchemaGrammarTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/Database/DatabaseMySqlSchemaGrammarTest.php b/tests/Database/DatabaseMySqlSchemaGrammarTest.php index 2a7821f31cb0..cf0b3fa010a3 100755 --- a/tests/Database/DatabaseMySqlSchemaGrammarTest.php +++ b/tests/Database/DatabaseMySqlSchemaGrammarTest.php @@ -46,6 +46,18 @@ public function testBasicCreateTable() $this->assertCount(1, $statements); $this->assertSame('alter table `users` add `id` int unsigned not null auto_increment primary key, add `email` varchar(255) not null', $statements[0]); + + $blueprint = new Blueprint('users'); + $blueprint->create(); + $blueprint->uuid('id')->primary(); + + $conn = $this->getConnection(); + $conn->shouldReceive('getConfig')->andReturn(null); + + $statements = $blueprint->toSql($conn, $this->getGrammar()); + + $this->assertCount(1, $statements); + $this->assertSame('create table `users` (`id` char(36) not null, primary key (`id`))', $statements[0]); } public function testAutoIncrementStartingValue() From 74b61d93ccf26b12cd47bce7c53ba514b694aff8 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 14 Dec 2023 14:03:55 -0600 Subject: [PATCH 6/6] formatting --- src/Illuminate/Database/Schema/Blueprint.php | 4 ++++ src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index a3179742491a..3e8eeab99b42 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -130,6 +130,10 @@ public function toSql(Connection $connection, Grammar $grammar) $this->ensureCommandsAreValid($connection); foreach ($this->commands as $command) { + if ($command->shouldBeSkipped) { + continue; + } + $method = 'compile'.ucfirst($command->name); if (method_exists($grammar, $method) || $grammar::hasMacro($method)) { diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 83011c9e62cf..9ccd2ace12df 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -251,13 +251,13 @@ protected function compileCreateTable($blueprint, $command, $connection) $tableStructure = $this->getColumns($blueprint); if ($primaryKey = $this->getCommandByName($blueprint, 'primary')) { - $tableStructure[] = sprintf('primary key %s(%s)', + $tableStructure[] = sprintf( + 'primary key %s(%s)', $primaryKey->algorithm ? 'using '.$primaryKey->algorithm : '', $this->columnize($primaryKey->columns) ); - // Prevents redundant alteration of the primary key. - unset($primaryKey['name']); + $primaryKey->shouldBeSkipped = true; } return sprintf('%s table %s (%s)',