| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | namespace think\console\command\optimize; |
| |
|
| | use think\App; |
| | use think\console\Command; |
| | use think\console\Input; |
| | use think\console\input\Option; |
| | use think\console\Output; |
| | use think\Db; |
| |
|
| | class Schema extends Command |
| | { |
| | |
| | protected $output; |
| |
|
| | protected function configure() |
| | { |
| | $this->setName('optimize:schema') |
| | ->addOption('config', null, Option::VALUE_REQUIRED, 'db config .') |
| | ->addOption('db', null, Option::VALUE_REQUIRED, 'db name .') |
| | ->addOption('table', null, Option::VALUE_REQUIRED, 'table name .') |
| | ->addOption('module', null, Option::VALUE_REQUIRED, 'module name .') |
| | ->setDescription('Build database schema cache.'); |
| | } |
| |
|
| | protected function execute(Input $input, Output $output) |
| | { |
| | if (!is_dir(RUNTIME_PATH . 'schema')) { |
| | @mkdir(RUNTIME_PATH . 'schema', 0755, true); |
| | } |
| | $config = []; |
| | if ($input->hasOption('config')) { |
| | $config = $input->getOption('config'); |
| | } |
| | if ($input->hasOption('module')) { |
| | $module = $input->getOption('module'); |
| | |
| | $path = APP_PATH . $module . DS . 'model'; |
| | $list = is_dir($path) ? scandir($path) : []; |
| | $app = App::$namespace; |
| | foreach ($list as $file) { |
| | if (0 === strpos($file, '.')) { |
| | continue; |
| | } |
| | $class = '\\' . $app . '\\' . $module . '\\model\\' . pathinfo($file, PATHINFO_FILENAME); |
| | $this->buildModelSchema($class); |
| | } |
| | $output->writeln('<info>Succeed!</info>'); |
| | return; |
| | } elseif ($input->hasOption('table')) { |
| | $table = $input->getOption('table'); |
| | if (!strpos($table, '.')) { |
| | $dbName = Db::connect($config)->getConfig('database'); |
| | } |
| | $tables[] = $table; |
| | } elseif ($input->hasOption('db')) { |
| | $dbName = $input->getOption('db'); |
| | $tables = Db::connect($config)->getTables($dbName); |
| | } elseif (!\think\Config::get('app_multi_module')) { |
| | $app = App::$namespace; |
| | $path = APP_PATH . 'model'; |
| | $list = is_dir($path) ? scandir($path) : []; |
| | foreach ($list as $file) { |
| | if (0 === strpos($file, '.')) { |
| | continue; |
| | } |
| | $class = '\\' . $app . '\\model\\' . pathinfo($file, PATHINFO_FILENAME); |
| | $this->buildModelSchema($class); |
| | } |
| | $output->writeln('<info>Succeed!</info>'); |
| | return; |
| | } else { |
| | $tables = Db::connect($config)->getTables(); |
| | } |
| |
|
| | $db = isset($dbName) ? $dbName . '.' : ''; |
| | $this->buildDataBaseSchema($tables, $db, $config); |
| |
|
| | $output->writeln('<info>Succeed!</info>'); |
| | } |
| |
|
| | protected function buildModelSchema($class) |
| | { |
| | $reflect = new \ReflectionClass($class); |
| | if (!$reflect->isAbstract() && $reflect->isSubclassOf('\think\Model')) { |
| | $table = $class::getTable(); |
| | $dbName = $class::getConfig('database'); |
| | $content = '<?php ' . PHP_EOL . 'return '; |
| | $info = $class::getConnection()->getFields($table); |
| | $content .= var_export($info, true) . ';'; |
| | file_put_contents(RUNTIME_PATH . 'schema' . DS . $dbName . '.' . $table . EXT, $content); |
| | } |
| | } |
| |
|
| | protected function buildDataBaseSchema($tables, $db, $config) |
| | { |
| | if ('' == $db) { |
| | $dbName = Db::connect($config)->getConfig('database') . '.'; |
| | } else { |
| | $dbName = $db; |
| | } |
| | foreach ($tables as $table) { |
| | $content = '<?php ' . PHP_EOL . 'return '; |
| | $info = Db::connect($config)->getFields($db . $table); |
| | $content .= var_export($info, true) . ';'; |
| | file_put_contents(RUNTIME_PATH . 'schema' . DS . $dbName . $table . EXT, $content); |
| | } |
| | } |
| | } |
| |
|