thinkphp6 使用自定义命令,生成数据库视图
在 ThinkPHP
命令行工具中,你可以为选项设置 别名,通过为选项指定一个简短的别名来简化命令输入。例如,如果你希望 --force-recreate
选项有一个简短的别名 -f
,你可以通过在 addOption
方法中设置第二个参数来实现这一点。
示例:为选项设置别名
在 addOption
方法的第二个参数中设置别名。这里是一个包含别名的示例:
<?php
declare (strict_types = 1);
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
class CreateViews extends Command
{
protected function configure()
{
// 设置命令名称和描述
$this->setName('创建视图')
->setDescription('为数据库中的所有表生成视图')
->addOption('force-recreate', 'f', Option::VALUE_NONE, '如果视图已经存在则强制重新创建');
}
protected function execute(Input $input, Output $output)
{
$forceRecreate = $input->getOption('force-recreate');
$tables = getAllTables();
// 获取是否删除现有视图的参数
if (empty($tables)) {
$output->writeln('没有找到任何表!');
return;
}
// 遍历所有表,为每个表创建视图
foreach ($tables as $tableName) {
$fields = 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(*) as 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 已存在,已删除旧视图。");
} else {
$output->writeln("视图 $viewName 已存在,跳过创建。");
continue; // 跳过当前表,继续处理下一个表
}
}
try {
// 生成 CREATE VIEW 语句
$createViewSql = "CREATE VIEW $viewName AS SELECT " . implode(', ', $selectFields) . " FROM $tableName";
Db::query($createViewSql);
$output->writeln("视图 $viewName 创建成功!\n");
} catch (\think\db\exception\DbException $e) {
// 捕获 SQL 异常
$output->writeln("视图 $viewName 创建失败!错误信息:" . $e->getMessage());
}
break;
}else{
$output->writeln("表 $tableName 没有字段!\n");
}
}
}
}
关键点:
- 别名的设置:在
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