From 33dfc0cf71873b49ccab085c64a783c621d5eecd Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 12 Mar 2026 09:46:07 -0500 Subject: [PATCH] =?UTF-8?q?fix(migrate):=20detectar=20tablas=20faltantes?= =?UTF-8?q?=20aunque=20migraci=C3=B3n=20est=C3=A9=20registrada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Si una migración está en la tabla migrations pero la tabla que crea ya no existe en la BD (ej. Coolify recreó la DB), el sistema la re-ejecuta automáticamente. Esto evita el error anterior donde 10 lab migrations estaban registradas como ejecutadas pero las tablas no existían. --- database/migrate.php | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/database/migrate.php b/database/migrate.php index 1061cdd..d6196ee 100644 --- a/database/migrate.php +++ b/database/migrate.php @@ -69,9 +69,37 @@ try { // Verificar si ya fue ejecutada if (in_array($filename, $executedFiles)) { - echo "⏭️ Saltando $filename (ya ejecutada)\n"; - $skipped_count++; - continue; + // Verificación extra: si el SQL crea tablas, comprobar que realmente existan. + // Si alguna tabla del archivo no existe, re-ejecutar la migración. + $sqlRaw = file_get_contents($file); + preg_match_all( + '/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?`?(\w+)`?/i', + $sqlRaw, + $tableMatches + ); + $missingTable = false; + foreach ($tableMatches[1] as $tableName) { + $rows = $db->fetchAll( + "SELECT COUNT(*) as cnt FROM information_schema.tables + WHERE table_schema = DATABASE() AND table_name = ?", + [$tableName] + ); + if (empty($rows) || ($rows[0]['cnt'] ?? 0) == 0) { + $missingTable = $tableName; + break; + } + } + if ($missingTable) { + echo "⚠️ $filename registrada pero tabla '$missingTable' no existe — re-ejecutando\n"; + // Quitar del registro para re-ejecutar + $db->execute("DELETE FROM migrations WHERE filename = ?", [$filename]); + $executedFiles = array_diff($executedFiles, [$filename]); + // Continúa a la ejecución abajo + } else { + echo "⏭️ Saltando $filename (ya ejecutada)\n"; + $skipped_count++; + continue; + } } echo "🔄 Ejecutando migración: $filename\n";