Skip to content

Commit 36c576e

Browse files
committed
Fix bug, add test, fix failing test
1 parent dd46d78 commit 36c576e

File tree

4 files changed

+77
-12
lines changed

4 files changed

+77
-12
lines changed

src/lib/migrations/BaseMigrationBuilder.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ function (string $unknownColumn) {
199199

200200
$columnsForChange = array_intersect($wantNames, $haveNames);
201201

202-
$columnsForRename = $this->handleColumnsRename($columnsForCreate, $columnsForDrop, $this->newColumns);
202+
$this->handleColumnsRename($columnsForCreate, $columnsForDrop, $this->newColumns);
203203

204204
if ($this->model->drop) {
205205
$this->newColumns = [];
@@ -625,6 +625,9 @@ public function handleColumnsRename(array &$columnsForCreate, array &$columnsFor
625625
{
626626
$keys = [];
627627
$existingColumns = $this->tableSchema->columns;
628+
if (count($existingColumns) !== count($newColumns)) {
629+
return;
630+
}
628631
$existingColumnNames = array_keys($existingColumns);
629632
$newColumnNames = array_flip(array_keys($newColumns));
630633
foreach ($columnsForCreate as $key => $column) {
@@ -633,7 +636,7 @@ public function handleColumnsRename(array &$columnsForCreate, array &$columnsFor
633636
if ($previousColumnName) {
634637
$current = $existingColumns[$previousColumnName];
635638
$desired = $newColumns[$column->name];
636-
$changedAttributes = $this->compareColumns($current, $desired);
639+
$changedAttributes = $this->compareColumns(clone $current, clone $desired);
637640
if (empty($changedAttributes)) {
638641
$keys[] = $key;
639642
$dropKeyOut = null;
@@ -645,6 +648,8 @@ public function handleColumnsRename(array &$columnsForCreate, array &$columnsFor
645648
// existing column name should be removed from $columnsForDrop
646649
unset($columnsForDrop[$dropKeyOut]);
647650

651+
// TODO check in `required` and `x-index`
652+
648653
// Create ALTER COLUMN NAME query
649654
$this->migration->addUpCode($this->recordBuilder->renameColumn($this->model->tableAlias, $previousColumnName, $column->name))
650655
->addDownCode($this->recordBuilder->renameColumn($this->model->tableAlias, $column->name, $previousColumnName));
@@ -654,7 +659,7 @@ public function handleColumnsRename(array &$columnsForCreate, array &$columnsFor
654659

655660
// new column name should be removed from $columnsForCreate
656661
foreach ($keys as $key) {
657-
unset($columnsForCreate[$key], $columnsForDrop[$previousColumnName]);
662+
unset($columnsForCreate[$key]);
658663
}
659664
}
660665
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
/**
4+
* Table for Fruit
5+
*/
6+
class m200000_000000_change_table_fruits extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->renameColumn('{{%fruits}}', 'name', 'name_2');
11+
$this->renameColumn('{{%fruits}}', 'description', 'description_2');
12+
}
13+
14+
public function down()
15+
{
16+
$this->renameColumn('{{%fruits}}', 'description_2', 'description');
17+
$this->renameColumn('{{%fruits}}', 'name_2', 'name');
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
/**
4+
* Table for Fruit
5+
*/
6+
class m200000_000000_change_table_fruits extends \yii\db\Migration
7+
{
8+
public function safeUp()
9+
{
10+
$this->renameColumn('{{%fruits}}', 'name', 'name_2');
11+
$this->renameColumn('{{%fruits}}', 'description', 'description_2');
12+
}
13+
14+
public function safeDown()
15+
{
16+
$this->renameColumn('{{%fruits}}', 'description_2', 'description');
17+
$this->renameColumn('{{%fruits}}', 'name_2', 'name');
18+
}
19+
}

tests/unit/IssueFixTest.php

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,9 @@ public function test25GenerateInverseRelations()
889889
// https://github.com/php-openapi/yii2-openapi/issues/63
890890
public function test63JustColumnNameRename()
891891
{
892+
$testFile = Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/index.php");
893+
894+
// MySQL
892895
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
893896
Yii::$app->db->createCommand()->createTable('{{%fruits}}', [
894897
'id' => 'pk',
@@ -897,17 +900,36 @@ public function test63JustColumnNameRename()
897900
'colour' => 'text',
898901
])->execute();
899902

900-
$testFile = Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/index.php");
901903
$this->runGenerator($testFile);
902-
// $this->runActualMigrations('mysql', 1);
903-
// $actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
904-
// 'recursive' => true,
905-
// ]);
906-
// $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/mysql"), [
907-
// 'recursive' => true,
908-
// ]);
909-
// $this->checkFiles($actualFiles, $expectedFiles);
904+
$this->runActualMigrations('mysql', 1);
905+
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
906+
'recursive' => true,
907+
]);
908+
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/mysql"), [
909+
'recursive' => true,
910+
]);
911+
$this->checkFiles($actualFiles, $expectedFiles);
912+
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
910913

914+
// PgSQL
915+
$this->changeDbToPgsql();
916+
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
917+
Yii::$app->db->createCommand()->createTable('{{%fruits}}', [
918+
'id' => 'pk',
919+
'name' => 'text',
920+
'description' => 'text',
921+
'colour' => 'text',
922+
])->execute();
923+
$this->runGenerator($testFile, 'pgsql');
924+
$this->runActualMigrations('pgsql', 1);
925+
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
926+
'recursive' => true,
927+
'except' => ['migrations_mysql_db']
928+
]);
929+
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/pgsql"), [
930+
'recursive' => true,
931+
]);
932+
$this->checkFiles($actualFiles, $expectedFiles);
911933
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
912934
}
913935
}

0 commit comments

Comments
 (0)