【TP5】根据数据库字段注释使用同一模板进行增删查(1)

简介: 【TP5】根据数据库字段注释使用同一模板进行增删查

author:咔咔


wechat:fangkangfk


有没有在添加跟修改的时候很烦,需要写很多页面,修改还需要追加数据,很烦,很烦


下来就解决这样的问题,所有模块的添加,修改,查看,都使用同一个模板


首先从数据库设计开始


注释解释:


域名地址:这个在添加或者修改时在lable标签里边写的


add=text:这个最终会以这个判断这个字段是什么类型,并且显示不同的标签


image.png


这里放一个写的比较全的

image.png


下来咱们先写一个获取数据库注释的方法


第一个方法是获取数据库注释,第二个方法是对注释进行业务需求的组装

    /**
     * author:咔咔
     *
     * 获取字段注释类型
     * @param $table  表名
     * @param bool $includePrimary
     * @return array
     */
    public function getFileCommon($table, $includePrimary = false)
    {
        $prefix = config('database.prefix');
        $data = Db::query('SHOW FULL COLUMNS FROM '.$prefix.$table);
        foreach($data as $row){
            if ($row['Comment']) {
                $row = array_merge($row, $this->_parse_comments($row['Comment']));
            }else {
                $row['DisplayName'] = $row['Field'];
            }
            $type = $row['Type'];
            if (preg_match('/^varchar/i', $type)) {
                $type = str_replace('varchar', '字符串', $type);
            } else if (preg_match('/^int/i', $type)) {
                $type = str_replace('int', '数字', $type);
            } else if (preg_match('/^tinyint/i', $type)) {
                $type = str_replace('tinyint', '数字', $type);
                preg_match('/\((\d+)\)/i', $type, $matches);
                $length = $matches[1];
            } else if (preg_match('/^text/i', $type)) {
                $type = str_replace('text', '文本', $type);
            } else if (preg_match('/^datetime/i', $type)) {
                $type = str_replace('datetime', '时间:YYY-MM-DD HH:II:SS', $type);
            }
            $row['DisplayType'] = $type;
            if ($includePrimary) {
                $fields[] = $row;
            } else {
                if ($row['Key'] != 'PRI') {
                    $fields[] = $row;
                }
            }
        }
        // 整理:以name为key
        $new_fields = array();
        foreach ($fields as $value) {
            $name = $value['Field'];
            $new_fields[$name] = $value;
        }
        return $new_fields;
    }
    /**
     * author:咔咔
     *
     * 提取字段注释跟显示类型
     * @param $comments  注释
     * @return array
     */
    protected function _parse_comments($comments)
    {
        $parts = explode("|", $comments);
        $comment = $parts[0];
        $params_string = $parts[1];
        if ($params_string) {
            parse_str($params_string, $params);
            foreach ($params as $key => $value) {
                if ($value == 'true') {
                    $value = true;
                }
                if ($value == 'false') {
                    $value = false;
                }
                $params[$key] = $value;
            }
        } else {
            $params = array();
        }
        $result = array('DisplayName' => $comment, 'Params' => $params);
        return $result;
    }

怎么使用?

我的domain控制器继承了base控制器,上面俩个方法在base控制器

屏幕快照 2022-05-12 下午10.38.03.png

image.png

{include file="../../../application/admin/view/public/head" /}
<?php foreach ($fields as $info):?>
<?php
            $type = $info['Params']['add'];
            $validateClass = "validate[required]";
        ?>
<?php if ($info['Params']['add'] == 'ignore'): ?>
<?php continue; ?>
<?php endif; ?>
<?php if ($info['Params']['add'] == 'hidden'): ?>
<input name="<?php echo $info['Field'];?>" type="hidden" value="<?php echo htmlspecialchars($info['Value']); ?>" />
<?php continue; ?>
<?php endif; ?>
<tr>
    <td>
        <?php if ($type == 'text'): ?>
        <div class="layui-form-item">
            <label class="layui-form-label"><?php echo $info['DisplayName'];?></label>
            <div class="layui-input-block">
                <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>">
            </div>
        </div>
        <?php elseif ($type == 'bool'): ?>
        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="1" checked>
        </label>
        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="2">
        </label>
        <?php elseif ($type == 'radio'): ?>
        <div class="layui-form-item">
        <label class="layui-form-label">类型</label>
        <div class="layui-input-block">
        <?php $items = explode(",", $info['Params']['items']); ?>
        <?php foreach ($items as $value): ?>
        <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }
                ?>
        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" checked> <?php echo $displayText; ?>
        </label>
        <?php endforeach; ?>
        </div>
        </div>
        <?php elseif ($type == 'checkbox'): ?>
        <?php $items = explode(",", $info['Params']['items']); ?>
        <?php foreach ($items as $value): ?>
        <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }
                ?>
        <label class="checkbox">
            <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>"> <?php echo $displayText;?>
        </label>
        <?php endforeach; ?>
        <?php elseif ($type == 'textarea'): ?>
        <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
        <?php elseif ($type == 'textarea_html'): ?>
        <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
        <?php elseif ($type == 'label'): ?>
        <?php echo htmlspecialchars($info['Default']);?>
        <?php elseif ($type == 'datetime'): ?>
        <?php continue; ?>
        <?php elseif ($type == 'image_upload'): ?>
        <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />
        <?php elseif ($type == 'file_upload'): ?>
        <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />
        <?php else: ?>
        <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
        <?php endif; ?>
    </td>
</tr>
<?php endforeach;?>
相关文章
|
2月前
|
缓存 数据库 数据安全/隐私保护
Discuz! X 数据库字典详解:DZ各数据表作用及字段含义
我们使用DISCUZ做网站时,有时需要对数据表进行操作,在操作数据表之前,需要对数据表进行了解。下面是DISCUZ 数据库各数据表作用及字段含义详解,方便新手更好的了解DISCUZ数据库。
54 4
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
66 8
|
3月前
|
JSON 数据库 数据格式
数据库表如果有json字段,该怎么更新
数据库表如果有json字段,该怎么更新
|
4月前
|
数据库
实体类的字段和数据库中的字段不一致、并且没有做中间替换、会发生什么
这篇文章讨论了实体类字段与数据库字段不一致时可能导致的问题,作者通过实际案例展示了字段不匹配时查询无法正确执行,并说明了修正字段匹配后查询可以成功执行的情况。
实体类的字段和数据库中的字段不一致、并且没有做中间替换、会发生什么
|
4月前
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
73 2
|
5月前
|
数据库
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
|
7月前
|
监控 关系型数据库 数据库
关系型数据库识别常查询字段
【5月更文挑战第20天】
59 4
|
7月前
|
监控 关系型数据库 数据库
|
6月前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用合集之基于django应用模板创建的FC,如何配置数据库
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。