diff --git a/src/Platforms/MySQLPlatform.php b/src/Platforms/MySQLPlatform.php index 06bc5975e6c..379616f22c6 100644 --- a/src/Platforms/MySQLPlatform.php +++ b/src/Platforms/MySQLPlatform.php @@ -185,7 +185,7 @@ public function getListTableForeignKeysSQL($table, $database = null) } $sql = 'SELECT DISTINCT k.`CONSTRAINT_NAME`, k.`COLUMN_NAME`, k.`REFERENCED_TABLE_NAME`, ' . - 'k.`REFERENCED_COLUMN_NAME` /*!50116 , c.update_rule, c.delete_rule */ ' . + 'k.`REFERENCED_COLUMN_NAME`, k.`ORDINAL_POSITION` /*!50116 , c.update_rule, c.delete_rule */ ' . 'FROM information_schema.key_column_usage k /*!50116 ' . 'INNER JOIN information_schema.referential_constraints c ON ' . ' c.constraint_name = k.constraint_name AND ' . @@ -195,7 +195,8 @@ public function getListTableForeignKeysSQL($table, $database = null) return $sql . ' AND k.table_schema = ' . $databaseNameSql . ' /*!50116 AND c.constraint_schema = ' . $databaseNameSql . ' */' - . ' AND k.`REFERENCED_COLUMN_NAME` is not NULL'; + . ' AND k.`REFERENCED_COLUMN_NAME` is not NULL' + . ' ORDER BY k.`ORDINAL_POSITION`'; } /** diff --git a/src/Platforms/SQLServer2012Platform.php b/src/Platforms/SQLServer2012Platform.php index fc72a402789..4db8f055ce7 100644 --- a/src/Platforms/SQLServer2012Platform.php +++ b/src/Platforms/SQLServer2012Platform.php @@ -1010,7 +1010,8 @@ public function getListTableForeignKeysSQL($table, $database = null) INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id ON f.OBJECT_ID = fc.constraint_object_id WHERE ' . - $this->getTableWhereClause($table, 'SCHEMA_NAME (f.schema_id)', 'OBJECT_NAME (f.parent_object_id)'); + $this->getTableWhereClause($table, 'SCHEMA_NAME (f.schema_id)', 'OBJECT_NAME (f.parent_object_id)') . + ' ORDER BY fc.constraint_column_id'; } /** diff --git a/tests/Functional/Schema/SchemaManagerFunctionalTestCase.php b/tests/Functional/Schema/SchemaManagerFunctionalTestCase.php index b5a8b8f31f9..e578e06ba3c 100644 --- a/tests/Functional/Schema/SchemaManagerFunctionalTestCase.php +++ b/tests/Functional/Schema/SchemaManagerFunctionalTestCase.php @@ -30,6 +30,7 @@ use Doctrine\DBAL\Types\StringType; use Doctrine\DBAL\Types\TextType; use Doctrine\DBAL\Types\Type; +use Doctrine\DBAL\Types\Types; use function array_filter; use function array_keys; @@ -1418,6 +1419,54 @@ public function testCommentInTable(): void $table = $this->schemaManager->listTableDetails('table_with_comment'); self::assertSame('Foo with control characters \'\\', $table->getComment()); } + + public function testCreatedCompositeForeignKeyOrderIsCorrectAfterCreation(): void + { + if (! $this->schemaManager->getDatabasePlatform()->supportsForeignKeyConstraints()) { + self::markTestSkipped('Platform does not support foreign keys.'); + } + + $foreignKey = 'fk_test_order'; + $localTable = 'test_table_foreign'; + $foreignTable = 'test_table_local'; + $localColumns = ['child_col2', 'child_col1']; + $foreignColumns = ['col2', 'col1']; + + $this->schemaManager->tryMethod('dropTable', $foreignTable); + $this->schemaManager->tryMethod('dropTable', $localTable); + + $table = new Table($localTable); + + $table->addColumn('col1', Types::INTEGER); + $table->addColumn('col2', Types::INTEGER); + $table->setPrimaryKey($foreignColumns); + + $this->schemaManager->createTable($table); + + $table = new Table($foreignTable); + + $table->addColumn('id', Types::INTEGER, ['autoincrement' => true]); + $table->addColumn('child_col1', Types::INTEGER); + $table->addColumn('child_col2', Types::INTEGER); + $table->setPrimaryKey(['id']); + + $table->addForeignKeyConstraint( + $localTable, + $localColumns, + $foreignColumns, + [], + $foreignKey + ); + + $this->schemaManager->createTable($table); + + $table = $this->schemaManager->listTableDetails($foreignTable); + + $foreignKey = $table->getForeignKey($foreignKey); + + self::assertSame($localColumns, array_map('strtolower', $foreignKey->getLocalColumns())); + self::assertSame($foreignColumns, array_map('strtolower', $foreignKey->getForeignColumns())); + } } interface ListTableColumnsDispatchEventListener