动态生成数据表

/**
 * 检查表是否存在
 * 
 * @param string $tableName 表名
 * @return bool 表是否存在
 */
private function tableExists($tableName): bool
{
    $result = Db::query("SHOW TABLES LIKE '{$tableName}'");
    return !empty($result);
}

/**
 * 创建表
 * 
 * @param string $tableName 表名
 * @param array $fields 字段信息数组
 * @param string $description 表描述
 * @return bool 是否成功创建表
 */
private function createTable($tableName, $fields, $description): bool
{
    try {
        // 构建默认的 SQL 语句,包含公共字段
        $sql = "CREATE TABLE `{$tableName}` (";
        $sql .= "`ID` INT AUTO_INCREMENT PRIMARY KEY COMMENT '序号',";
        $sql .= "`CREATED_BY` VARCHAR(64) NOT NULL COMMENT '创建人',";
        $sql .= "`CREATED_TIME` DATETIME NOT NULL COMMENT '创建时间',";
        $sql .= "`UPDATED_BY` VARCHAR(64) NOT NULL COMMENT '更新人',";
        $sql .= "`UPDATED_TIME` DATETIME NOT NULL COMMENT '更新时间',";

        // 拼接传递过来的字段
        foreach ($fields as $field) {
            $fieldName = $field['TABLE_FIELD_VALUE'];
            $fieldType = $field['TABLE_TYPE'];
            $fieldLength = isset($field['TABLE_LEN']) ? "({$field['TABLE_LEN']})" : '';
            $fieldComment = isset($field['TABLE_COMMENTS']) ? " COMMENT '{$field['TABLE_COMMENTS']}'" : '';
            $sql .= "`{$fieldName}` {$fieldType}{$fieldLength}{$fieldComment},";
        }

        // 移除最后一个逗号并结束语句
        $sql = rtrim($sql, ',') . ') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="' . $description . '";';

        // 执行 SQL 语句
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 更新表结构
 * 
 * @param string $tableName 表名
 * @param array $fields 字段信息数组
 * @return bool 是否成功更新表结构
 */
private function updateTable($tableName, $fields): bool
{
    try {
        // 获取现有表的字段信息
        $existingFields = Db::query("SHOW COLUMNS FROM `{$tableName}`");
        $existingFieldNames = array_column($existingFields, 'Field');

        // 记录要增加和删除的字段
        $addFields = [];
        $dropFields = array_flip($existingFieldNames);

        foreach ($fields as $field) {
            $fieldName = $field['TABLE_FIELD_VALUE'];
            $fieldType = $field['TABLE_TYPE'];
            $fieldLength = isset($field['TABLE_LEN']) ? "({$field['TABLE_LEN']})" : '';
            $fieldComment = isset($field['TABLE_COMMENTS']) ? " COMMENT '{$field['TABLE_COMMENTS']}'" : '';
            $fieldSql = "`{$fieldName}` {$fieldType}{$fieldLength}{$fieldComment}";

            if (in_array($fieldName, $existingFieldNames)) {
                if ($fieldName !== 'ID') {
                    unset($dropFields[$fieldName]);
                    // 修改字段
                    $addFields[] = "MODIFY {$fieldSql}";
                }
            } else {
                // 增加字段
                $addFields[] = "ADD {$fieldSql}";
            }
        }

        // 移除 'ID' 字段以防止删除它
        unset($dropFields['ID']);

        // 拼接 ALTER TABLE 语句
        $alterSql = "ALTER TABLE `{$tableName}` ";
        $alterSql .= implode(', ', $addFields);

        if (!empty($dropFields)) {
            foreach ($dropFields as $fieldName => $index) {
                $alterSql .= ", DROP `{$fieldName}`";
            }
        }

        // 执行 SQL 语句
        Db::execute($alterSql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 为字段添加索引
 * 
 * @param string $tableName 表名
 * @param string $fieldName 字段名
 * @param string|null $indexName 索引名(可选)
 * @return bool 是否成功添加索引
 */
private function addIndex($tableName, $fieldName, $indexName = null): bool
{
    try {
        $indexName = $indexName ?: $fieldName . '_idx';
        $sql = "CREATE INDEX `{$indexName}` ON `{$tableName}` (`{$fieldName}`)";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 删除索引
 * 
 * @param string $tableName 表名
 * @param string $indexName 索引名
 * @return bool 是否成功删除索引
 */
private function dropIndex($tableName, $indexName): bool
{
    try {
        $sql = "DROP INDEX `{$indexName}` ON `{$tableName}`";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 为字段添加主键
 * 
 * @param string $tableName 表名
 * @param string $fieldName 字段名
 * @return bool 是否成功添加主键
 */
private function addPrimaryKey($tableName, $fieldName): bool
{
    try {
        if ($fieldName !== 'ID') {
            $sql = "ALTER TABLE `{$tableName}` ADD PRIMARY KEY (`{$fieldName}`)";
            Db::execute($sql);
            return true;
        }
        return false;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 删除主键
 * 
 * @param string $tableName 表名
 * @return bool 是否成功删除主键
 */
private function dropPrimaryKey($tableName): bool
{
    try {
        $sql = "ALTER TABLE `{$tableName}` DROP PRIMARY KEY";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

说明

  • 在每个方法中加入了 try-catch 块,用于捕获异常。
  • 如果执行成功,返回 true;如果执行失败(抛出异常),返回 false
posted @ 2024-07-19 17:47  xingduo  阅读(5)  评论(0编辑  收藏  举报