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
总结:
thinkphp6 使用自定义命令,生成数据库视图的更多相关文章
- NetCore使用使用Scaffold-DbContext命令生成数据库表实体类
一.为了模拟项目,本处创建了一个NetCore的Web项目.打算在Models文件夹下生成数据库表的实体类. 二.在程序包管理控制台,输入“Scaffold-DbContext "Serve ...
- EF使用CodeFirst方式生成数据库&技巧经验
前言 EF已经发布很久了,也有越来越多的人在使用EF.如果你已经能够非常熟练的使用EF的功能,那么就不需要看了.本文意在将自己使用EF的方式记录下来备忘,也是为了给刚刚入门的同学一些指导.看完此文,你 ...
- node生成自定义命令(yargs/commander)
第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而comma ...
- Maven之自定义archetype生成项目骨架(一)
Maven之自定义archetype生成项目骨架(一) 标签: mavennexus插件 2015-07-15 16:40 2443人阅读 评论(0) 收藏 举报 分类: Maven技术(9) ...
- (转)Maven之自定义archetype生成项目骨架
背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...
- 一个简单的NetCore项目:1 - 搭建框架,生成数据库
1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...
- How to: Map a Persistent Class to a Database View Which Has No Key Field如何:映射持久化类到无主键数据库视图
With XAF, you can build new applications from scratch or maintain existing databases. The How to: Ge ...
- 【AMAD】django-extensions -- Django框架的自定义命令扩展集合
动机 简介 个人评分 动机 使用Django进行开发的时候,会不会感觉开发工具少了一些.比如每次进入python shell调试的时候要重新import每个model. 简介 django-exten ...
- SyBase Powerdesigner生成数据库详细表
工具: Sybase PowerDesigner 15.1 Microsoft SQL Server 2005 第一步概要设计: 打开PowerDesigner软件,设计“概念数据模型”(Concep ...
- DB2LOOK命令提取数据库对象信息
提取复制数据库的DDL语句:db2look -d BCDLJS -e -o db2look.sql -a -a:导出所有用户的DDL-o: 定向结果到文件-d: 数据库名-e: 抽取复制数据库所需的 ...
随机推荐
- Flutter一些概念(一)
1 简述Flutter是什么以及它的主要优势 Flutter是一种由Google开发的开源移动应用开发框架,可以用于构建高度定制化.美观并且性能卓越的移动应用程序,其主要优势有: 跨平台,一次编码,可 ...
- CDS标准视图:功能位置种类描述 I_FlocCategoryText
视图名称:功能位置种类描述 I_FlocCategoryText 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Functional Location - Tex ...
- c# Progress<T>
c# Progress<T> 用于显示进度........主要是利用IProgress<T> 的Report(T)方法: private void BtnDownload_Cl ...
- Linux常见问题合集
Linux基本指令 连接SSH ssh uesrname@ip 例如:ssh root@192.168.43.217 Linux 创建多级目录命令: mkdir -p 示例:mkdir -p proj ...
- w3cschool-Groovy 教程
Groovy的特点 Groovy中有以下特点: 同时支持静态和动态类型. 支持运算符重载. 本地语法列表和关联数组. 对正则表达式的本地支持. 各种标记语言,如XML和HTML原生支持. Groovy ...
- superset 1.3版本WIN10安装实录
首先说下,为什么要这么做,因为二开需要,二开要有源码,然后对源码修改,编译,所以不能通过类似https://zhuanlan.zhihu.com/p/271695878这种方式,直接安装: 1.去Gi ...
- MongoDB:文档基本CRUD
- Kevin pg walkthrough Easy
第二个window 靶机 尝试访问 80 web界面 然后是个登录界面 我尝试admin admin 登录成功 发现版本 发现了exp https://www.exploit-db.com/explo ...
- ChatGpt怎么玩
注册 梯子 先找好梯子, 归属地最好是米国之类的, 否则提示 OpenAI's services are not available in your country. 注: 最好用固定代理, 如tro ...
- [Java] Solon 框架的三大核心组件之一插件扩展体系
1.Solon 的三大核心组件 核心组件 说明 Plugin 插件扩展机制 提供"编码风格"的扩展体系 Ioc/Aop 应用容器 提供基于注入依赖的自动装配体系 Context+H ...