setName('scheme:sync') ->addOption('skip-data', null, Option::VALUE_NONE, 'Skip data migration') ->addOption('force', null, Option::VALUE_NONE, 'Force execution without confirmation') ->setDescription('Synchronize Scheme classes to Database'); } protected function execute(Input $input, Output $output) { $skipData = $input->getOption('skip-data'); $service = new SchemeToDbService(); $schemeDir = app()->getAppPath() . 'admin/scheme/'; $ignoreTables = Config::get('scheme.ignore_tables', []); $connection = Config::get('database.default', 'mysql'); $prefix = Config::get('database.connections.' . $connection . '.prefix', ''); if (!is_dir($schemeDir)) { $output->writeln("Scheme directory not found: $schemeDir"); return; } $files = glob($schemeDir . '*.php'); foreach ($files as $file) { require_once $file; $className = 'app\\admin\\scheme\\' . basename($file, '.php'); if (class_exists($className)) { $tableName = $this->getTableNameFromScheme($className); if (!empty($tableName) && $this->isIgnoredTable($tableName, $ignoreTables, $prefix)) { $output->writeln("Skipping $className (ignored table: $tableName)"); continue; } $output->writeln("Syncing $className..."); try { $backup = $service->sync($className, $skipData); $output->writeln("Success!"); if ($backup) { $output->writeln("Backup created: $backup"); } } catch (\Exception $e) { $output->writeln("Failed: " . $e->getMessage() . ""); } } } } protected function getTableNameFromScheme(string $className): string { try { $ref = new ReflectionClass($className); $tableAttrs = $ref->getAttributes(Table::class); if (empty($tableAttrs)) { return ''; } $tableAttr = $tableAttrs[0]->newInstance(); return (string)($tableAttr->name ?? ''); } catch (\Throwable $e) { return ''; } } protected function isIgnoredTable(string $tableName, array $ignoreTables, string $prefix): bool { if (empty($ignoreTables)) { return false; } $shortName = $tableName; if ($prefix && str_starts_with($tableName, $prefix)) { $shortName = substr($tableName, strlen($prefix)); } return in_array($shortName, $ignoreTables, true) || in_array($tableName, $ignoreTables, true); } }