|
|
<?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); |
|
|
} |
|
|
} |
|
|
} |
|
|
|