<?php namespace app\common\model\base\models; /** * @title : 模型管理 * @desc : * @Author : Rock * @Date : 2023-04-11 20:02:14 */ use app\common\model\Common; use think\facade\Db; use think\model\concern\SoftDelete; class ModelManage extends Common { use SoftDelete; protected $name = 'system_auto_model'; protected $pk = 'id'; protected $append = [ 'status_txt', 'classname' ]; public function getDirnameAttr($value,$data) { $value = $value??$data['dirname']; return str_replace(['/','\\'],'/',$value); } public function getClassnameAttr($value,$data) { return $data['name']?self::getCamel($data['name']):''; } static public function statusList() { return [1=>'启用',2=>'停用']; } public function getStatusTxtAttr($value,$row) { $statusList = self::statusList(); return $statusList[$value ?? $row['status']] ?? ''; } static public function engineList() { return ['MyISAM','InnoDB']; } public function fields() { return $this->hasMany(ModelFields::class,'name','model_name'); } /** * @title: 获取所有数据表 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-26 10:20:58 */ static public function getTableList():array { $sql = "SHOW TABLE STATUS"; return Db::query($sql); } /** * @title: 检查表是否存在 * @desc: 描述 * @param {string} {name} {} {待检查的表名} * @return {boolean} {} {} {true存在,false不存在} * @author: Rock * @method: POST * @Date: 2023-04-17 08:16:41 */ static public function checkTable(string $name):bool { $database = config('database.connections.mysql.database'); $sql = "SELECT * FROM information_schema.TABLES WHERE TABLE_NAME = '$name' AND TABLE_SCHEMA='$database'"; $res = Db::query($sql); return $res && count($res) > 0; } /** * @title: 获取数据表主键 * @desc: 描述 * @param {string} {table} {} {表名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-26 10:08:30 */ static public function pk(string $table):string { $fieldList = self::getFieldList($table); foreach($fieldList as $item){ if('PRI'==$item['Key']){ return $item['Field']; } } return ''; } /** * @title: 获取数据表注释 * @desc: 描述 * @param {string} {table} {} {表名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-26 10:14:13 */ static public function getComment(string $table):string { $database = config('database.connections.mysql.database'); $sql = "SELECT TABLE_COMMENT FROM information_schema.TABLES WHERE table_name = '$table' AND TABLE_SCHEMA='$database'"; $res = Db::query($sql); return $res?$res[0]['TABLE_COMMENT']:''; } /** * @title: 获取数据表字段 * @desc: 描述 * @param {string} {table} {} {表名]} * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-26 10:15:35 */ static public function getFieldList(string $table):array { $sql = "SHOW FULL COLUMNS FROM `$table`"; return Db::query($sql); } /** * @title: 创建表 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-14 09:08:20 */ static public function createTable(int $id) { $info = self::find($id); $tableName = $info->getAttr('name'); $title = $info->title; $engine = $info->engine; $sql = <<<SQL CREATE TABLE IF NOT EXISTS `$tableName` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `create_at` datetime DEFAULT NULL COMMENT '创建时间', `update_at` datetime DEFAULT NULL COMMENT '更新时间', `delete_at` datetime DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`) ) ENGINE=$engine AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='$title' SQL; $res = Db::execute($sql); return $res; } /** * @title: 修改表 * @desc: 描述 * @param {int} {id} {} {模型ID} * @param {string} {oldname} {} {原表名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-17 09:08:41 */ static public function updateTable(int $id,string $oldname) { $info = self::find($id); $name = $info->getAttr('name'); $engine = $info->getAttr('engine'); $title = $info->getAttr('title'); $sql = "ALTER TABLE $oldname RENAME $name" ; $res = Db::execute($sql); $sql = "ALTER TABLE $name ENGINE = $engine COMMENT = '$title'"; $res = Db::execute($sql); return $res; } /** * @title: 删除表 * @desc: 描述 * @param {int} {id} {} {模型ID} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-14 09:08:47 */ static public function deleteTable(int $id) { $info = self::find($id); $name = $info->getAttr('name'); $sql = "DROP TABLE IF EXISTS $name"; $res = Db::execute($sql); return $res; } /** * @title: 复制表 * @desc: 描述 * @param {int} $id * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-27 14:37:08 */ static public function copyTable(int $id) { $info = self::find($id); $name = $info->getAttr('name'); $title = $info->getAttr('title'); $sql = "SHOW CREATE TABLE $name"; $tableSql = Db::query($sql); if($tableSql){ $sql = $tableSql[0]['Create Table']; $sql = str_replace("TABLE `$name`","TABLE `{$name}_copy`",$sql); $sql = str_replace("COMMENT='$title'","COMMENT='{$title}副本'",$sql); Db::execute($sql); return true; } return false; } /** * @title: 获取英文的驼峰写法 * @desc: 描述 * @param {string} $name * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-25 11:46:37 */ static public function getCamel(string $name) { $arr = explode('_',$name); $arr = array_filter($arr); $classname = ""; foreach($arr as $item){ $classname .= ucfirst($item); } return $classname; } }