thinkphp6 使用自定义命令,生成数据库视图

news/2024/11/16 11:28:43/文章来源:https://www.cnblogs.com/zxingduo/p/18549179

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
    

总结:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书生共学大模型训练营第4期 L1G200任务提交

MindSearch搜索引擎示例书生浦语对话模型调用示例书生万象开源视觉语言模型调用实例进阶任务:MindSearch话题挑战 https://www.zhihu.com/people/zhang-shu-yang-92-96

使用nvm管理多版本node的详细教程

在开发工作中,经常在不同的项目中使用不同版本的node去开发,换一个项目在重新安装node太麻烦,所以使用nvm来管理多版本的node开发环境,就非常方便了,所以本文给大家介绍了如何使用nvm管理多版本node,需要的朋友可以参考下前言 在开发工作中,经常在不同的项目中使用不同版本的n…

Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Nov 14, 2024 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

.ts文件和d.ts文件对比

TS中有俩种文件类型,一种是.ts文件,一种是.d.ts文件 .ts文件 既可以包含类型信息也可以写逻辑代码 可以被编译为js文件 .d.ts文件 只能包含类型信息不可以写逻辑代码 不会被编译为js文件,仅做类型校验检查 自定义类型声明文件 d.ts文件在项目中是可以进行自定义创建的,通常…

Ubuntu Server 20.04 安装MySQL

1. 通过apt安装MySQL1 #命令1 2 sudo apt-get update 3 #命令2 4 sudo apt-get install mysql-server2. 配置mysql初始化信息1 sudo mysql_secure_installation配置说明:ubuntu@VM-0-10-ubuntu:~$ sudo mysql_secure_installationSecuring the MySQL server deployment.Connec…

【Adobe Photoshop 2025下载与安装】

‌Photoshop 2025的安装环境要求主要包括操作系统、处理器、内存、显卡、显示器分辨率和硬盘空间等方面的具体要求。‌ 操作系统要求‌Windows‌:支持Windows 10(版本21H2)或更高版本,不支持Windows的长期服务版(LTSC)。处理器要求‌Windows‌:支持64位的多核Intel或AMD…

IPEX几代接口的区别

IPEX共分五代,简单判别IPEX接口是几代的方法是测量直径。 IPEX 1代 高度小于3.0mm,端子口径φ2.0 IPEX 2代 高度小于2.1mm,端子口径φ2.0 IPEX 3代 高度小于1.6mm,端子口径φ1.4 IPEX 4代 高度小于1.7mm,端子口径φ1.5 IPEX 5代 高度小于1.3mm,…

vue3:computed

扫码或者点击文字后台提问 原文: https://mp.weixin.qq.com/s/36dd--oj6jmkZblfJRh4iw computed 支持选项式写法 和 函数式写法 1.选项式写法 支持一个对象传入get函数以及set函数自定义操作2.函数式写法 只能支持一个getter函数不允许修改值的<template><div>&l…

2024 腾讯云双十一省钱攻略:如何选购服务器、操作指南

一、前言 每年的双十一,都是一个 “剁手狂欢” 的好时机,不仅是购物平台,各大云服务商也会在此期间推一、前言 每年的双十一,都是一个 “剁手狂欢” 的好时机,不仅是购物平台,各大云服务商也会在此期间推出力度空前的优惠活动。今年,我特别关注了腾讯云的双十一活动,发…

阿里云域名解析

第一步: 在域名解析这里修改记录类型是A 的,主机记录是@ 和www的即可。 第二步: 重新申请https证书,然后配置nginx 的配置文件https证实,然后重新启动nginx 命令: ./nginx -s reload

Codeforces Round 987 (Div. 2)

Codeforces Round 987 (Div. 2) 总结 A 常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的 \(a\) 序列保证不上升,所以只需要考虑相同长度的一段。 #include <iostream> #include <cstdio…

利用PyTorch的三元组损失Hard Triplet Loss进行嵌入模型微调

本文介绍如何使用 PyTorch 和三元组边缘损失 (Triplet Margin Loss) 微调嵌入模型,并重点阐述实现细节和代码示例。三元组损失是一种对比损失函数,通过缩小锚点与正例间的距离,同时扩大锚点与负例间的距离来优化模型。 https://avoid.overfit.cn/post/4b8a8e91f3274f8ca41b…