| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719 | <?phpnamespace app\admin\controller\famysql;use app\common\controller\Backend;use think\Db;use think\Config;/** * 字段管理 */class Field extends Backend{    protected $dbName = '';    protected $noNeedRight = ['selectfields', 'getType', 'getSuffix'];    public function _initialize()    {        parent::_initialize();        if (!config("app_debug")) {            $this->error("数据库管理插件只允许在开发环境下使用");        }        if (!$this->auth->isSuperAdmin()) {            $this->error(__('Access is allowed only to the super management group'));        }        $this->dbName = Config::get("database.database");        $this->view->assign("suffixList", $this->getSuffixList());    }    /**     * 字段首页     */    public function fields()    {        $name = $this->request->get('name');        $is_admin = (int) $this->request->get('is_admin');        $offset = $this->request->get("offset");        $limit = $this->request->get("limit");        if ($name == NULL) {            $this->error(__('Parameter %s can not be empty', 'name'));        }        $ints = ["int", "tinyint", "smallint", "mediumint", "bigint", "float", "double", "decimal"];        if ($this->request->isAjax()) {            $tableFields = Db::table("information_schema.COLUMNS")->field("*")->where(['TABLE_SCHEMA' => $this->dbName, 'TABLE_NAME' => $name])->select();            $list = [];            foreach ($tableFields as $key => $tableField) {                $list[$key]['id'] = $tableField['ORDINAL_POSITION'];                $list[$key]['name'] = $tableField['COLUMN_NAME'];                $list[$key]['type'] = $tableField['DATA_TYPE'];                $list[$key]['length'] = $tableField['COLUMN_TYPE'];                $list[$key]['default'] = $tableField['COLUMN_DEFAULT'];                $list[$key]['primary_key'] = $tableField['COLUMN_KEY'] == 'PRI' ? 1 : 0;                $list[$key]['index'] = $tableField['COLUMN_KEY'] == 'MUL' ? 1 : 0;                $list[$key]['is_null'] = $tableField['IS_NULLABLE'] == 'YES' ? '否' : '是';                $list[$key]['unsigned'] = strpos($tableField['COLUMN_TYPE'], 'unsigned') !== false ? '是' : (in_array($tableField['DATA_TYPE'], $ints) ? '否' : '-');                $list[$key]['auto_increment'] = strpos($tableField['EXTRA'], 'auto_increment') !== false ? 1 : 0;                $list[$key]['comment'] = $tableField['COLUMN_COMMENT'];                $list[$key]['is_admin'] = $is_admin;            }            $result = array("total" => count($list), "rows" => array_slice($list, $offset, $limit));            return json($result);        }        $this->view->assign("name", $name);        $this->view->assign("is_admin", $is_admin);        return $this->view->fetch();    }    /**     * 快速建表     */    public function create()    {        $name = $this->request->get('name');        $is_admin = (int) $this->request->get('is_admin');        if ($name == NULL) {            $this->error(__('Parameter %s can not be empty', 'name'));        }        if ($this->request->isPost()) {            $params = $this->request->post("row/a");            if ($params) {                $result = false;                $sql = "ALTER TABLE `{$name}`";                $column_name = explode(',', $params['column_name']);                foreach ($column_name as $column) {                    $sql .= $this->getCommonFields($column);                }                $sql = rtrim($sql, ',');                Db::startTrans();                try {                    $result = Db::execute($sql);                    if (Db::getPdo()->inTransaction() == true) {                        Db::commit();                    }                } catch (\think\exception\PDOException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (\think\Exception $e) {                    Db::rollback();                    $this->error($e->getMessage());                }                if ($result !== false) {                    $this->success();                } else {                    $this->error(__('No rows were inserted'));                }            }            $this->error(__('Parameter %s can not be empty', ''));        }        $this->view->assign("name", $name);        $this->view->assign("is_admin", $is_admin);        return $this->view->fetch();    }    /**     * 添加字段     */    public function field_add()    {        if ($this->request->isPost()) {            $name = $this->request->param('name');            $params = $this->request->post("row/a");            $column_name = $params['suffix'] == '无' ? $params['name'] : $params['name'] . $params['suffix'];            if ($params) {                $result = false;                $sql = "ALTER TABLE `{$name}` ADD COLUMN `{$column_name}` ";                Db::startTrans();                try {                    if (in_array($params['type'], ['enum', 'set'])) {                        $length_arr = json_decode($params['length'], true);                        $default_arr = [];                        foreach ($length_arr as $value) {                            $default_arr[] = $value['vo'];                        }                        $params['length'] = $default_arr;                    }                    $sql .= $this->getFieldSql($column_name, $params);                    $result = Db::execute($sql);                    if (Db::getPdo()->inTransaction() == true) {                        Db::commit();                    }                } catch (\think\exception\PDOException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (\think\Exception $e) {                    Db::rollback();                    $this->error($e->getMessage());                }                if ($result !== false) {                    $this->success();                } else {                    $this->error(__('No rows were updated'));                }            }        }        return $this->view->fetch();    }    /**     * 修改字段     */    public function field_edit()    {        $table = $this->request->param("table");        if ($table == NULL) {            $this->error(__('Parameter %s can not be empty', 'table'));        }        $field = $this->request->param("field");        if ($field == NULL) {            $this->error(__('Parameter %s can not be empty', 'field'));        }        $properties = Db::query("SHOW FULL COLUMNS FROM `{$table}` WHERE Field =  '{$field}'");        $type_arr = explode(" ", $properties[0]["Type"]);        $type = strstr($type_arr[0], "(", true) !== false ? strstr($type_arr[0], "(", true) : $type_arr[0];        $length = preg_match('/\((.*?)\)/', $type_arr[0], $matches) ? $matches[1] : 0;        $row['name'] = $properties[0]["Field"];        $row['type'] = $type;        $row['collate'] = $properties[0]["Collation"];        if (in_array($type, ["enum", "set"])) {            $length_arr = explode(",", $length);            $length_res = [];            foreach ($length_arr as $key => $value) {                preg_match("/\'(.*?)\'/", $value, $matches);                $length_res[$key]['vo'] = $matches[1];            }            $length = json_encode($length_res);        }        $row['length'] = $length;        $row['default'] = $properties[0]["Default"];        $row['is_null'] = $properties[0]["Null"];        $row['unsigned'] = in_array("unsigned", $type_arr) ? 1 : 0;        $row['zerofill'] = in_array("zerofill", $type_arr) ? 1 : 0;        $row['comment'] = $properties[0]["Comment"];        if ($this->request->isPost()) {            $params = $this->request->post("row/a");            if ($params) {                $result = false;                $sql = "ALTER TABLE `{$table}` MODIFY COLUMN `{$field}` ";                Db::startTrans();                try {                    if ($params['name'] !== $row['name']) {                        $sql = "ALTER TABLE `{$table}` CHANGE `{$row['name']}` `{$params['name']}`";                    }                    if (in_array($params['type'], ['enum', 'set'])) {                        $length_arr = json_decode($params['length'], true);                        $default_arr = [];                        foreach ($length_arr as $value) {                            $default_arr[] = $value['vo'];                        }                        $params['length'] = $default_arr;                    }                    $sql .= $this->getFieldSql($params['name'], $params);                    // halt($sql);                    $result = Db::execute($sql);                    if (Db::getPdo()->inTransaction() == true) {                        Db::commit();                    }                } catch (\think\exception\PDOException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (\think\Exception $e) {                    Db::rollback();                    $this->error($e->getMessage());                }                if ($result !== false) {                    $this->success();                } else {                    $this->error(__('No rows were updated'));                }            }            $this->error(__('Parameter %s can not be empty', ''));        }        $ints = ["int", "tinyint", "smallint", "mediumint", "bigint", "float", "double", "decimal"];        $no_length = ['date', 'datetime', 'time', 'year', "mediumtext", "longtext", "text"];        $this->view->assign("row", $row);        $this->view->assign("is_int", in_array($row['type'], $ints));        $this->view->assign("is_enum", in_array($row['type'], ['enum', 'set']));        $this->view->assign("is_length", in_array($row['type'], $no_length));        return $this->view->fetch();    }    /**     * 删除     */    public function field_del()    {        $table = $this->request->param("table");        if ($table == NULL) {            $this->error(__('Parameter %s can not be empty', 'table'));        }        $field = $this->request->param("field");        if ($field == NULL) {            $this->error(__('Parameter %s can not be empty', 'field'));        }        $result = false;        Db::startTrans();        try {            $sql = "ALTER TABLE `{$table}` DROP COLUMN `{$field}`;";            $result = Db::execute($sql);            if (Db::getPdo()->inTransaction() == true) {                Db::commit();            }        } catch (\think\exception\PDOException $e) {            Db::rollback();            $this->error($e->getMessage());        } catch (\think\Exception $e) {            Db::rollback();            $this->error($e->getMessage());        }        if ($result !== false) {            $this->success();        } else {            $this->error(__('No rows were deleted'));        }    }    /**     * 字段排序     */    public function field_drag()    {        $name = $this->request->get('name');        if ($name == NULL) {            $this->error(__('Parameter %s can not be empty', 'name'));        }        $fields = Db::getTableFields($name);        //排序的数组        $ids = $this->request->post("ids");        //拖动的记录ID        $changeid = (int) $this->request->post("changeid");        $ids = explode(',', $ids);        $position = array_search($changeid, $ids);        switch ($position) {            case 0:                if ($ids[array_search($changeid, $ids) + 1] > 1) {                    $changeField = $fields[$changeid - 1];                    $afterField = $fields[$ids[1] - 2];                    $properties = $this->getProperties($name, $changeField);                    $sql = "ALTER TABLE `{$name}` MODIFY COLUMN  `{$changeField}` {$properties} AFTER `{$afterField}`";                } else {                    $afterField = $fields[$changeid - 1];                    $properties = $this->getProperties($name, $afterField);                    $sql = "ALTER TABLE `{$name}` MODIFY COLUMN  `{$afterField}` {$properties} FIRST";                }                break;            default:                $changeField = $fields[$changeid - 1];                $afterField = $fields[($ids[array_search($changeid, $ids) - 1] - 1)];                $properties = $this->getProperties($name, $changeField);                $sql = "ALTER TABLE `{$name}` MODIFY COLUMN  `{$changeField}` {$properties} AFTER `{$afterField}`";        }        $result = false;        Db::startTrans();        try {            $result = Db::execute($sql);            if (Db::getPdo()->inTransaction() == true) {                Db::commit();            }        } catch (\think\exception\PDOException $e) {            Db::rollback();            $this->error($e->getMessage());        } catch (\think\Exception $e) {            Db::rollback();            $this->error($e->getMessage());        }        if ($result !== false) {            $this->success();        } else {            $this->error(__('No rows were updated'));        }    }    /**     * 查看     * @internal     */    public function index()    {        $this->error('禁止访问');    }    /**     * 添加     * @internal     */    public function add()    {        $this->error('禁止访问');    }    /**     * 编辑     * @param string $ids     * @internal     */    public function edit($ids = null)    {        $this->error('禁止访问');    }    /**     * 删除     * @param string $ids     * @internal     */    public function del($ids = null)    {        $this->error('禁止访问');    }    /**     * 批量更新     * @internal     * @param string $ids     * @return void     */    public function multi($ids = null)    {        $this->error('禁止访问');    }    /**     * 字段选择     * @internal     */    public function selectfields()    {        //当前页        $page = $this->request->request("pageNumber");        //分页大小        $pagesize = $this->request->request("pageSize");        $q_word = (array) $this->request->request("q_word/a");        $word = $q_word[0];        $custom = (array) $this->request->request("custom/a");        if ($custom && is_array($custom)) {            $table = $custom['table'];        }        $fields = $this->getFields($table, ['id']);        $commonFields = $this->getCommonFields();        $fieldLists = [];        foreach ($commonFields as $commonField) {            if (!in_array($commonField['column_name'], $fields)) {                $fieldLists[] = $commonField;            }        }        if (!empty($word)) {            $res_arr = [];            foreach ($fieldLists as $fieldList) {                $res_arr[] = $fieldList['column_name'] . '-' . $fieldList['comment'];            }            $res_arr = array_filter($res_arr, function ($v) use ($word) {                return stripos($v, $word) !== false;            });            $res_arrs = array_values($res_arr);            $fieldLists_arr = [];            foreach ($res_arrs as $res) {                $fieldLists_arr[] = [                    'column_name' => explode('-', $res)[0],                    'comment' => explode('-', $res)[1]                ];            }            $fieldLists = $fieldLists_arr;        }        $result = array("total" => count($fieldLists), "list" => array_slice($fieldLists, ($page - 1) * $pagesize, $pagesize));        return json($result);    }    /**     * 字段类型     * @internal     */    public function getType()    {        //当前页        $page = $this->request->request("pageNumber");        //分页大小        $pagesize = $this->request->request("pageSize");        $q_word = (array) $this->request->request("q_word/a");        $word = $q_word ? $q_word[0] : '';        $custom = (array) $this->request->request("custom/a");        $keyValue = $this->request->request('keyValue');        if (!$keyValue) {            $suffix = [];            $type = [];            if ($custom && is_array($custom)) {                $suffix = $custom['suffix'];                $suffixList = $this->getSuffixList($suffix);                $type = !is_array($suffixList['type']) ? [$suffixList['type']] : $suffixList['type'];            }            $typeList = $this->getTypeList($type);            $lists = [];            foreach ($typeList as $v) {                $lists[] = ['type' => $v];            }            if (!empty($word)) {                $res_arr = [];                foreach ($lists as $list) {                    $res_arr[] = $list['type'];                }                $res_arr = array_filter($res_arr, function ($v) use ($word) {                    return stripos($v, $word) !== false;                });                $res_arrs = array_values($res_arr);                $lists_arr = [];                foreach ($res_arrs as $res) {                    $lists_arr[] = [                        'type' => $res,                    ];                }                $lists = $lists_arr;            }        } else {            $lists[] = ['type' => $keyValue];        }        $result = array("total" => count($lists), "rows" => array_slice($lists, ($page - 1) * $pagesize, $pagesize));        return json($result);    }    /**     * 字段后缀     * @internal     */    public function getSuffix()    {        $name = $this->request->request("name");        $suffix = $this->getSuffixList($name);        return json($suffix);    }    /**     * 读取后缀规则     * @return array     */    protected function getSuffixList($suffix = '')    {        $suffixList = [];        $suffixList['time'] = ["type" => ["bigint", "datetime"], "length" => 16, "default" => NULL, "comment" => '时间', "remark" => '识别为日期时间型数据,自动创建选择时间的组件'];        $suffixList['image'] = ["type" => ["varchar"], "length" => 255, "default" => '', "comment" => '缩略图', "remark" => '识别为图片文件,自动生成可上传图片的组件,单图'];        $suffixList['images'] = ["type" => ["varchar"], "length" => 1500, "default" => '', "comment" => '组图', "remark" => '识别为图片文件,自动生成可上传图片的组件,多图'];        $suffixList['file'] = ["type" => ["varchar"], "length" => 100, "default" => '', "is_null" => 1, "comment" => '附件', "remark" => '识别为普通文件,自动生成可上传文件的组件,单文件'];        $suffixList['files'] = ["type" => ["varchar"], "length" => 1000, "default" => '', "is_null" => 1, "comment" => '附件', "remark" => '识别为普通文件,自动生成可上传文件的组件,多文件'];        $suffixList['avatar'] = ["type" => ["varchar"], "length" => 255, "default" => '', "is_null" => 1, "comment" => '头像', "remark" => '识别为头像,自动生成可上传图片的组件,单图'];        $suffixList['avatars'] = ["type" => ["varchar"], "length" => 1500, "default" => '', "is_null" => 1, "comment" => '头像', "remark" => '识别为头像,自动生成可上传图片的组件,多图'];        $suffixList['seconds'] = ["type" => ["int"], "length" => 10, "default" => NULL, "is_null" => 1, "comment" => '时长/分钟'];        $suffixList['price'] = ["type" => ["decimal"], "length" => '10,2', "default" => '0.00', "is_null" => 1, 'unsigned' => 1, "comment" => '价格'];        $suffixList['content'] = ["type" => ["text", "mediumtext", "longtext"], "is_null" => 1, "comment" => '内容', "remark" => '识别为内容,自动生成富文本编辑器(需安装富文本插件)'];        $suffixList['_id'] = ["type" => ["int"], "length" => 10, "default" => 0, "is_null" => 1, "unsigned" => 1, "zerofill" => 0, "comment" => 'ID', "remark" => '识别为关联字段,自动生成可自动完成的文本框,单选'];        $suffixList['_ids'] = ["type" => ["varchar"], "length" => 100, "default" => '', "comment" => 'ID集合', "remark" => '识别为关联字段,自动生成可自动完成的文本框,多选'];        $suffixList['list'] = ["type" => ["enum", "set"], "is_null" => 1, "remark" => ['识别为列表字段,自动生成单选下拉列表', '识别为列表字段,自动生成多选下拉列表']];        $suffixList['data'] = ["type" => ["enum", "set"], "is_null" => 1, "remark" => ['识别为选项字段,自动生成单选框', '识别为选项字段,自动生成复选框']];        if (version_compare(config('fastadmin.version'), '1.3.0', '<')) {            $suffixList['json'] = ["type" => ["varchar"], "length" => 255, "default" => '', "is_null" => 1, "comment" => '管理员ID', "remark" => '识别为键值组件,自动生成键值录入组件,仅支持1.2.0+'];            $suffixList['switch'] = ["type" => ["tinyint"], "length" => 1, "default" => 0, "is_null" => 1, "comment" => '开关', "remark" => '识别为开关字段,自动生成开关组件,默认值1为开,0为关,仅支持FastAdmin 1.2.0+'];        } else {            $suffixList['range'] = ["type" => ["varchar"], "length" => 100, "default" => '', "is_null" => 1, "comment" => '区间', "remark" => '识别为时间区间组件,自动生成时间区间组件,仅支持FastAdmin 1.3.0+'];            $suffixList['tag'] = ["type" => ["varchar"], "length" => 255, "default" => '', "is_null" => 1, "comment" => '标签', "remark" => '识别为Tagsinput,自动生成标签输入组件,仅支持FastAdmin 1.3.0+'];            $suffixList['tags'] = ["type" => ["varchar"], "length" => 255, "default" => '', "is_null" => 1, "comment" => '标签组', "remark" => '识别为Tagsinput,自动生成标签输入组件,仅支持FastAdmin 1.3.0+'];        }        return empty($suffix) ? array_keys($suffixList) : $suffixList[$suffix];    }    /**     * 读取类型规则     * @return array     */    protected function getTypeList($types = [])    {        $typeList = [];        $sql = "SELECT DISTINCT DATA_TYPE FROM information_schema.COLUMNS";        $result = Db::query($sql);        foreach ($result as $key => $value) {            $typeList[$value['DATA_TYPE']] = $value['DATA_TYPE'];            if (!empty($types) && !in_array($value['DATA_TYPE'], $types)) {                unset($typeList[$value['DATA_TYPE']]);            }        }        return $typeList;    }    protected function getCommonFields($fields = '')    {        $fieldList = include ADDON_PATH . 'famysql' . DS . 'data' . DS . 'fields.php';        $fields = $fields == '' ? [] : explode(',', $fields);        if (!empty($fields)) {            $sql = "";            foreach ($fieldList as $field => $fieldInfo) {                if (in_array($field, $fields)) {                    $sql .= " ADD COLUMN `{$field}`" . $this->getFieldSql($field, $fieldInfo);                    $sql .= ",";                }            }            return $sql;        } else {            $fields = array_keys($fieldList);            $result = [];            foreach ($fields as $key => $field) {                $result[$key] = [                    "column_name" => $field,                    "comment" => isset($fieldList[$field]['comment']) ? $fieldList[$field]['comment'] : ucwords($field)                ];            }            return $result;        }    }    /**     * 获取表字段属性     */    protected function getProperties($table, $field)    {        $all = Db::query("SHOW FULL COLUMNS FROM `{$table}` WHERE Field =  '{$field}'");        $str = '';        $str .= "{$all[0]['Type']}";        if ($all[0]['Collation'] != NULL) {            $charset = substr($all[0]['Collation'], 0, strpos($all[0]['Collation'], '_'));            $str .= " CHARACTER SET {$charset} COLLATE {$all[0]['Collation']}";        }        if ($all[0]['Null'] == 'NO')            $str .= '  NOT NULL';        if ($all[0]['Default'] === '')            $str .= " DEFAULT ''";        if ($all[0]['Default'] != NULL && $all[0]['Default'] != '')            $str .= " DEFAULT '{$all[0]['Default']}'";        if ($all[0]['Extra'] == 'auto_increment')            $str .= ' AUTO_INCREMENT';        $str .= " Comment '{$all[0]['Comment']}'";        return $str;    }    protected function getFieldSql($field, $fieldInfo)    {        $sql = "";        if (isset($fieldInfo['type'])) {            $sql .= " {$fieldInfo['type']}";        }        if (!in_array($fieldInfo['type'], ["enum", "set"]) && isset($fieldInfo['length'])) {            $sql .= "(" . $fieldInfo['length'] . ")";        } elseif (in_array($fieldInfo['type'], ["enum", "set"])) {            $length = "";            foreach ($fieldInfo['length'] as $value) {                $length .= "'{$value}',";            }            $length = rtrim($length, ",");            $sql .= "(" . $length . ")";        }        if (isset($fieldInfo['unsigned']) && $fieldInfo['unsigned'] == 1) {            $sql .= " UNSIGNED";        }        if (isset($fieldInfo['zerofill']) && $fieldInfo['zerofill'] == 1) {            $sql .= " ZEROFILL";        }        if (isset($fieldInfo['is_null']) && $fieldInfo['is_null'] == 0) {            $sql .= " NOT NULL";        }        if (isset($fieldInfo['default'])) {            if (in_array($fieldInfo['type'], ["int", "tinyint", "smallint", "mediumint", "bigint"])) {                if ($fieldInfo['default'] == "") {                    $sql .= "";                } elseif ($fieldInfo['default'] == 0) {                    $sql .= " DEFAULT 0";                } else {                    $sql .= empty($fieldInfo['default']) ? "" : " DEFAULT {$fieldInfo['default']}";                }            } elseif (in_array($fieldInfo['type'], ["float", "double", "decimal"])) {                if ($fieldInfo['default'] == "") {                    $sql .= "";                } elseif ($fieldInfo['default'] == 0) {                    $sql .= " DEFAULT '0.00'";                } else {                    $sql .= empty($fieldInfo['default']) ? "" : " DEFAULT '{$fieldInfo['default']}'";                }            } elseif (in_array($fieldInfo['type'], ["text", "longtext", "mediumtext"])) {                $sql .= empty($fieldInfo['default']) ? "" : " DEFAULT '{$fieldInfo['default']}'";            } elseif (in_array($fieldInfo['type'], ["enum", "set"])) {                $sql .= (empty($fieldInfo['default']) && $fieldInfo['default'] !== '0') ? "" : " DEFAULT '{$fieldInfo['default']}'";            } else {                if ($fieldInfo['default'] === '0') {                    $sql .= " DEFAULT '0'";                } elseif (empty($fieldInfo['default'])) {                } else {                    $sql .= " DEFAULT '{$fieldInfo['default']}'";                }            }        }        $comment = isset($fieldInfo['comment']) ? $fieldInfo['comment'] : ucwords($field);        $sql .= " COMMENT '{$comment}'";        return $sql;    }    protected function getFields($table, $excludeFields = [])    {        $fields = Db::getFields($table);        $result = [];        foreach ($fields as $field => $fieldInfo) {            if (!in_array($field, $excludeFields)) {                $result[] = $field;            }        }        return $result;    }}
 |