diff --git a/src/SchemaVersionControl/SchemaNormalizer.php b/src/SchemaVersionControl/SchemaNormalizer.php index bcda343e..136271b8 100644 --- a/src/SchemaVersionControl/SchemaNormalizer.php +++ b/src/SchemaVersionControl/SchemaNormalizer.php @@ -72,6 +72,9 @@ protected function normalizeTable(Table $table) foreach ($table->getForeignKeys() as $foreignKey) { $tableDesc['foreign_keys'][$foreignKey->getName()] = $this->normalizeForeignKeyConstraint($foreignKey); } + if (isset($tableDesc['foreign_keys'])) { + ksort($tableDesc['foreign_keys']); + } return $tableDesc; } diff --git a/tests/SchemaVersionControl/SchemaNormalizerTest.php b/tests/SchemaVersionControl/SchemaNormalizerTest.php new file mode 100644 index 00000000..2b5a363b --- /dev/null +++ b/tests/SchemaVersionControl/SchemaNormalizerTest.php @@ -0,0 +1,35 @@ +createTable('users'); + $users->addColumn('id', 'integer'); + $users->setPrimaryKey(['id']); + + $reviews = $schema->createTable('reviews'); + $reviews->addColumn('id', 'integer'); + $reviews->addColumn('reviewed_by', 'integer'); + $reviews->addColumn('reversed_by', 'integer'); + $reviews->setPrimaryKey(['id']); + // Add in Z→A order to prove sorting is applied, not insertion order + $reviews->addForeignKeyConstraint('users', ['reversed_by'], ['id'], [], 'FK_ZZZ'); + $reviews->addForeignKeyConstraint('users', ['reviewed_by'], ['id'], [], 'FK_AAA'); + + $normalizer = new SchemaNormalizer(); + $result = $normalizer->normalize($schema, new SchemaConfig()); + + $fkKeys = array_keys($result['tables']['reviews']['foreign_keys']); + $this->assertSame(['FK_AAA', 'FK_ZZZ'], $fkKeys); + } +}