记录一次因 mysql 字段取名不规范导致的问题

1. bug 出现过程

我使用的是 laravel-admin(1.8.10) 框架,使用框架提供的 Form 组件搭建 Form 表单,其中用到了 checkbox 组件,数据库取的字段名称是tagIds ,字段类型是 json

代码如下:
$form->checkbox('tagIds', '选择XX')->options(['1' => 'xx', '2' => 'xxx'])

就这样出现了问题。

2. 问题描述

表单提交没有任何问题,但是在修改数据时,其他字段都能正常显示已有的值,唯独使用了 checkbox 的字段无法选中已选中的选项。

3. 解决问题

首先怀疑是不是取回该字段的时候返回的不是数组格式,经过打印数据,发现返回的该字段值是 null(从数据库中取出来的数据结果确实是数组格式)
,经过一系列的排查,到 laravel-admin 底层顺藤摸瓜,终于找到了问题根本:
laravel-admin在 Encore\Admin\Form 使用了 Encore\Admin\Traits\ShouldSnakeAttributes
类。
Encore\Admin\Form\Field\Checkbox 类继承了 Encore\Admin\Form\Field\MultipleSelect 类,在 MultipleSelect 类的方法 fill 里有下面这段代码:

        if ($this->form && $this->form->shouldSnakeAttributes()) {
            $key = Str::snake($this->column);
        } else {
            $key = $this->column;
        }

看到这里问题就显而易见了,在修改渲染页面的时候,将字段转换成了蛇形命名方式,然后寻找的是蛇形字段的值,所以像 tagIds 这种的字段就找不到原字段的值了

4. 解决方式

tagIds 这种命名字段的方式改为 tag_ids,问题最终得以解决。

谨以此记录一下该问题,以防下次再遇到同样的错误。也在这里提醒一下使用 laravel-admin 框架的朋友,这里有个坑!

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

WINDOWS 系统不区分字段大小写,LINUX区分

2年前 评论
xujinhuan (楼主) 2年前

字段名驼峰命名好像不合适吧,我都是用下划线

2年前 评论
xujinhuan (楼主) 2年前

这个明显是你的字段名字起的不规范啊。


基本命名原则
使用有意义的英文词汇,词汇中间以下划线分隔。(不要用拼音)
只能使用英文字母,数字,下划线,并以英文字母开头。
库、表、字段全部采用小写,不要使用驼峰式命名。
避免用ORACLE、MySQL的保留字,如desc,关键字如index。
命名禁止超过32个字符,须见名之意,建议使用名词不是动词
数据库,数据表一律使用前缀

临时库、表名必须以tmp为前缀,并以日期为后缀
备份库、表必须以bak为前缀,并以日期为后缀
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!