From e615c748fc37097749eebd479230e9846bcd306e Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Thu, 4 Feb 2021 20:25:41 +0200 Subject: [PATCH 1/2] allow adding multiple columns after a column --- src/Illuminate/Database/Schema/Blueprint.php | 56 +++++++++++++++---- .../DatabaseMySqlSchemaGrammarTest.php | 13 +++++ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index 41ed3d90c361..3f20564bfe1d 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -71,6 +71,13 @@ class Blueprint */ public $temporary = false; + /** + * The column to add new columns after. + * + * @var string + */ + public $after; + /** * Create a new schema blueprint. * @@ -836,14 +843,12 @@ public function unsignedBigInteger($column, $autoIncrement = false) */ public function foreignId($column) { - $this->columns[] = $column = new ForeignIdColumnDefinition($this, [ + return $this->addColumnDefinition(new ForeignIdColumnDefinition($this, [ 'type' => 'bigInteger', 'name' => $column, 'autoIncrement' => false, 'unsigned' => true, - ]); - - return $column; + ])); } /** @@ -1189,10 +1194,10 @@ public function uuid($column) */ public function foreignUuid($column) { - return $this->columns[] = new ForeignIdColumnDefinition($this, [ + return $this->addColumnDefinition(new ForeignIdColumnDefinition($this, [ 'type' => 'uuid', 'name' => $column, - ]); + ])); } /** @@ -1435,6 +1440,39 @@ public function rememberToken() return $this->string('remember_token', 100)->nullable(); } + /** + * @param string $column + * @param \Closure $callback + * @return void + */ + public function after($column, Closure $callback ) + { + $this->after = $column; + + $callback($this); + + $this->after = null; + } + + /** + * Add a new column definition to the blueprint. + * + * @param \Illuminate\Database\Schema\ColumnDefinition $definition + * @return \Illuminate\Database\Schema\ColumnDefinition + */ + protected function addColumnDefinition($definition) + { + $this->columns[] = $definition; + + if ($this->after) { + $definition->after($this->after); + + $this->after = $definition->name; + } + + return $definition; + } + /** * Add a new index command to the blueprint. * @@ -1504,11 +1542,9 @@ protected function createIndexName($type, array $columns) */ public function addColumn($type, $name, array $parameters = []) { - $this->columns[] = $column = new ColumnDefinition( + return $this->addColumnDefinition(new ColumnDefinition( array_merge(compact('type', 'name'), $parameters) - ); - - return $column; + )); } /** diff --git a/tests/Database/DatabaseMySqlSchemaGrammarTest.php b/tests/Database/DatabaseMySqlSchemaGrammarTest.php index d35d8ab91792..4c8813130677 100755 --- a/tests/Database/DatabaseMySqlSchemaGrammarTest.php +++ b/tests/Database/DatabaseMySqlSchemaGrammarTest.php @@ -504,6 +504,19 @@ public function testAddingColumnAfterAnotherColumn() $this->assertSame('alter table `users` add `name` varchar(255) not null after `foo`', $statements[0]); } + public function testAddingMultipleColumnsAfterAnotherColumn() + { + $blueprint = new Blueprint('users'); + $blueprint->after('foo', function ($blueprint) { + $blueprint->string('one'); + $blueprint->string('two'); + }); + $blueprint->string('three'); + $statements = $blueprint->toSql($this->getConnection(), $this->getGrammar()); + $this->assertCount(1, $statements); + $this->assertSame('alter table `users` add `one` varchar(255) not null after `foo`, add `two` varchar(255) not null after `one`, add `three` varchar(255) not null', $statements[0]); + } + public function testAddingGeneratedColumn() { $blueprint = new Blueprint('products'); From cbfc50d46e5da88ce671aac8281bbda439a78ebe Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Thu, 4 Feb 2021 20:29:15 +0200 Subject: [PATCH 2/2] update style --- src/Illuminate/Database/Schema/Blueprint.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index 3f20564bfe1d..ae802cd60683 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -1441,11 +1441,13 @@ public function rememberToken() } /** + * Add the columns from the callback after the given column. + * * @param string $column * @param \Closure $callback * @return void */ - public function after($column, Closure $callback ) + public function after($column, Closure $callback) { $this->after = $column;