diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 4acde7b5ce..768ae7b6c7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -87,6 +87,7 @@ Yii Framework 2 Change Log - Enh #13994: Refactored `yii\filters\RateLimiter`. Added tests (vladis84) - Enh #14059: Removed unused AR instantiating for calling of static methods (ElisDN) - Enh: Added `yii\di\Instance::__set_state()` method to restore object after serialization using `var_export()` function (silvefire) +- Bug #14072: Fixed a bug where `\yii\db\Command::createTable()`, `addForeignKey()`, `dropForeignKey()`, `addCommentOnColumn()`, and `dropCommentFromColumn()` weren't refreshing the table cache on `yii\db\Schema` (brandonkelly) - Bug #10305: Oracle SQL queries with `IN` condition and more than 1000 parameters are working now (silverfire) diff --git a/framework/db/Command.php b/framework/db/Command.php index 3713bf5b36..a423f9ba3a 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -537,7 +537,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->createTable($table, $columns, $options); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -680,7 +680,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete, $update); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -693,7 +693,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->dropForeignKey($name, $table); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -771,7 +771,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->addCommentOnColumn($table, $column, $comment); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -801,7 +801,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->dropCommentFromColumn($table, $column); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 5e7b3f3802..5c544dca54 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -809,17 +809,36 @@ SQL; { $db = $this->getConnection(false); $tableName = 'test'; + $fkName = 'test_fk'; + + $this->assertNull($db->getSchema()->getTableSchema($tableName)); $db->createCommand()->createTable($tableName, [ 'id' => 'pk', + 'fk' => 'int', 'name' => 'string', ])->execute(); $initialSchema = $db->getSchema()->getTableSchema($tableName); + $this->assertNotNull($initialSchema); $db->createCommand()->addColumn($tableName, 'value', 'integer')->execute(); $newSchema = $db->getSchema()->getTableSchema($tableName); $this->assertNotEquals($initialSchema, $newSchema); + if ($this->driverName !== 'sqlite') { + $db->createCommand()->addForeignKey($fkName, $tableName, 'fk', $tableName, 'id')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + + $db->createCommand()->dropForeignKey($fkName, $tableName)->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + + $db->createCommand()->addCommentOnColumn($tableName, 'id', 'Test comment')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + + $db->createCommand()->dropCommentFromColumn($tableName, 'id')->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + } + $db->createCommand()->dropTable($tableName)->execute(); $this->assertNull($db->getSchema()->getTableSchema($tableName)); }