From 2c3b83e37351e0fc3a2f6cbfbd4024a0fbf80665 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jun 2026 13:47:20 +0200 Subject: [PATCH] perf(database): index migrations by name --- .../src/Migrations/MigrationManager.php | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/database/src/Migrations/MigrationManager.php b/packages/database/src/Migrations/MigrationManager.php index edc25a22c..7d871d89a 100644 --- a/packages/database/src/Migrations/MigrationManager.php +++ b/packages/database/src/Migrations/MigrationManager.php @@ -135,16 +135,15 @@ public function rehashAll(): void return; } + $migrationsByName = $this->getMigrationsByName(); + foreach ($existingMigrations as $existingMigration) { /** * We need to find and delete migration DB records that no longer have a corresponding migration file. * This can happen if a migration file was deleted or renamed. * If we don't do it, `:validate` will continue failing due to the missing migration file. */ - $databaseMigration = array_find( - iterator_to_array($this->migrations), - static fn (MigratesUp|MigratesDown $migration) => $migration->name === $existingMigration->name, - ); + $databaseMigration = $migrationsByName[$existingMigration->name] ?? null; if ($databaseMigration === null) { $existingMigration->delete(); @@ -166,11 +165,10 @@ public function validate(): void return; } + $migrationsByName = $this->getMigrationsByName(); + foreach ($existingMigrations as $existingMigration) { - $databaseMigration = array_find( - iterator_to_array($this->migrations), - static fn (MigratesUp|MigratesDown $migration) => $migration->name === $existingMigration->name, - ); + $databaseMigration = $migrationsByName[$existingMigration->name] ?? null; if ($databaseMigration === null) { event(new MigrationValidationFailed($existingMigration->name, new MigrationFileWasMissing())); @@ -301,6 +299,18 @@ private function getTableDefinitions(): array ); } + /** @return array */ + private function getMigrationsByName(): array + { + $migrations = []; + + foreach ($this->migrations as $migration) { + $migrations[$migration->name] = $migration; + } + + return $migrations; + } + private function getMigrationHash(MigratesUp|MigratesDown $migration): string { $sql = '';