记录一次因 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 协议》,转载必须注明作者和本文链接
推荐文章: