diff --git a/lib/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php b/lib/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php index 993d20a1f42b008b2309b5af370aa5d347ff2672..f5db5af1907ffacaccda33639551826de21df776 100644 --- a/lib/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php +++ b/lib/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php @@ -89,6 +89,14 @@ class RemoveNamespacedAssets implements Visitor */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { + // The table may already be deleted in a previous + // RemoveNamespacedAssets#acceptTable call. Removing Foreign keys that + // point to nowhere. + if ( ! $this->schema->hasTable($fkConstraint->getForeignTableName())) { + $localTable->removeForeignKey($fkConstraint->getName()); + return; + } + $foreignTable = $this->schema->getTable($fkConstraint->getForeignTableName()); if ( ! $foreignTable->isInDefaultNamespace($this->schema->getName()) ) { $localTable->removeForeignKey($fkConstraint->getName()); diff --git a/tests/Doctrine/Tests/DBAL/Schema/Visitor/RemoveNamespacedAssetsTest.php b/tests/Doctrine/Tests/DBAL/Schema/Visitor/RemoveNamespacedAssetsTest.php index b7c849c8e572a1e927626a6ba3fba36f4104e117..e5b660f6b654393b6a16d52e26f290bc575b85e4 100644 --- a/tests/Doctrine/Tests/DBAL/Schema/Visitor/RemoveNamespacedAssetsTest.php +++ b/tests/Doctrine/Tests/DBAL/Schema/Visitor/RemoveNamespacedAssetsTest.php @@ -37,6 +37,29 @@ class RemoveNamespacedAssetsTest extends \PHPUnit_Framework_TestCase $config->setName("test"); $schema = new Schema(array(), array(), $config); + $fooTable = $schema->createTable("foo.bar"); + $fooTable->addColumn('id', 'integer'); + + $testTable = $schema->createTable("test.test"); + $testTable->addColumn('id', 'integer'); + + $testTable->addForeignKeyConstraint("foo.bar", array("id"), array("id")); + + $schema->visit(new RemoveNamespacedAssets()); + + $sql = $schema->toSql(new MySqlPlatform()); + $this->assertEquals(1, count($sql), "Just one CREATE TABLE statement, no foreign key and table to foo.bar"); + } + + /** + * @group DBAL-204 + */ + public function testCleanupForeignKeysDifferentOrder() + { + $config = new SchemaConfig; + $config->setName("test"); + $schema = new Schema(array(), array(), $config); + $testTable = $schema->createTable("test.test"); $testTable->addColumn('id', 'integer');