在 ThinkPHP
命令行工具中,你可以为选项设置 别名,通过为选项指定一个简短的别名来简化命令输入。例如,如果你希望 --force-recreate
选项有一个简短的别名 -f
,你可以通过在 addOption
方法中设置第二个参数来实现这一点。
示例:为选项设置别名
在 addOption
方法的第二个参数中设置别名。这里是一个包含别名的示例:
<?phpnamespace app\command;use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\console\input\Option;
use think\Db;class CreateViews extends Command
{protected function configure(){$this->setName('createViews') // 设置命令名称->setDescription('为数据库中的所有表生成视图。') // 设置命令描述// 添加选项:是否强制重新创建视图,并设置别名 '-f'->addOption('force-recreate', 'f', // 设置别名 '-f'Option::VALUE_NONE, '如果视图已经存在,则强制重新创建视图。' // 选项提示)// 添加选项:是否跳过已存在的视图,并设置别名 '-s'->addOption('skip-existing', 's', // 设置别名 '-s'Option::VALUE_NONE, '如果视图已经存在,跳过视图创建。' // 选项提示);}protected function execute(Input $input, Output $output){$tables = $this->getAllTables();// 获取命令行参数:是否强制重建视图$forceRecreate = $input->getOption('force-recreate');// 获取命令行参数:是否跳过已存在视图$skipExisting = $input->getOption('skip-existing');// 默认行为:如果没有传递参数,则设置跳过已存在视图if (!$forceRecreate && !$skipExisting) {$skipExisting = true; // 默认跳过视图创建}if (empty($tables)) {$output->writeln('没有找到任何表!');return;}// 遍历所有表,为每个表创建视图foreach ($tables as $tableName) {$fields = $this->getTableFields($tableName);if (!empty($fields)) {// 初始化字段映射$fieldMappings = ['CREATED_BY' => 'CREATOR_ID','CREATED_TIME' => 'CREATE_TIME','UPDATED_BY' => 'UPDATE_USER_ID','UPDATED_TIME' => 'UPDATE_TIME','DELETED' => 'DEL_FLAG'];// 构建 SELECT 语句$selectFields = [];foreach ($fields as $columnName) {// 如果表中包含指定字段,进行重命名if (array_key_exists($columnName, $fieldMappings)) {$selectFields[] = "$columnName AS " . $fieldMappings[$columnName];} else {$selectFields[] = $columnName;}}// 生成视图名称:使用 'view_' 作为前缀$viewName = 'view_' . $tableName;// 检查视图是否已经存在$viewExists = Db::query("SELECT COUNT(*) FROM information_schema.views WHERE table_name = '$viewName' AND table_schema = DATABASE()");if ($viewExists[0]['COUNT(*)'] > 0) {if ($forceRecreate) {// 如果视图存在并且需要强制重建,则先删除旧视图Db::query("DROP VIEW IF EXISTS $viewName");$output->writeln("视图 $viewName 已存在,已删除旧视图。");} elseif ($skipExisting) {// 默认行为,跳过创建视图$output->writeln("视图 $viewName 已存在,跳过创建。");continue; // 跳过当前表,继续处理下一个表} else {// 如果没有传入选项,默认跳过创建视图$output->writeln("视图 $viewName 已存在,未执行操作。");continue; // 跳过当前表,继续处理下一个表}}// 生成 CREATE VIEW 语句$createViewSql = "CREATE VIEW $viewName AS SELECT " . implode(', ', $selectFields) . " FROM $tableName";$res = Db::query($createViewSql);if ($res) {$output->writeln("视图 $viewName 创建成功!");} else {$output->writeln("视图 $viewName 创建失败!");}} else {$output->writeln("表 $tableName 没有字段!");}}}// 获取数据库中所有的表名protected function getAllTables(){return Db::query("SHOW TABLES");}// 获取指定表的所有字段protected function getTableFields($tableName){return Db::query("DESCRIBE $tableName");}
}
关键点:
- 别名的设置:在
addOption
方法的第二个参数中设置别名:--force-recreate
的别名是-f
。--skip-existing
的别名是-s
。
使用命令行时:
你可以通过别名来快速使用选项。例如:
-
使用
-f
别名代替--force-recreate
:php think createViews -f
-
使用
-s
别名代替--skip-existing
:php think createViews -s
-
使用完整选项:
php think createViews --force-recreate --skip-existing