Laravel报错1364:classifieds表identifier字段无默认值排查
报错常见排查方向
当前执行的插入SQL为:insert into \classifieds` (`vehicle_id`, `vehicle_type`, `updated_at`, `created_at`) values (19983, App\Models\Car, 2021-04-27 16:27:56, 2021-04-27 16:27:56)`
触发的数据库层面报错为:
SQLSTATE[HY000]: General error: 1364 Field 'identifier' doesn't have a default value
结合近一周修改代码后才出现问题的场景,可按以下方向定位原因:
- 核对数据库表结构的实际变动
近一周的代码修改大概率伴随数据库迁移操作:如果之前identifier字段允许为空、或配置了数据库层面的默认值,近期迁移将该字段调整为非空且移除默认值配置,而现有插入逻辑本身没有给该字段赋值,就会直接触发报错。可直接连库查看classifieds表的identifier字段属性,确认其是否为非空、是否存在默认值。 - 检查模型批量赋值配置的改动
虽然此前$fillable配置运行正常,但需确认:- 近期是否在代码中新增了给
identifier字段赋值的逻辑,但没有把该字段加入$fillable白名单,导致模型自动过滤掉该字段的赋值,最终生成的插入SQL中不会包含这个字段 - 是否在修改代码时不小心覆盖了原有
$fillable配置,或是将配置切换为$guarded时遗漏了identifier字段的排除规则
- 近期是否在代码中新增了给
- 排查业务逻辑中的赋值丢失
从生成的SQL可以看到,当前插入语句完全没有包含identifier字段,说明整个赋值流程中没有给这个字段传入值。大概率是近期修改代码时,删掉了原本存在的identifier赋值步骤——比如原先在创建分类记录的数组中,本来有'identifier' => $生成的唯一业务标识的配置,改动时不慎遗漏。 - 验证模型事件的绑定状态
如果之前identifier字段的值是通过模型的创建监听事件自动生成填充的,近期修改代码时如果注释、移除了对应的事件绑定逻辑,就会导致字段值没有被自动填充,最终插入数据库时因字段无默认值触发报错。
内容的提问来源于stack exchange,提问作者Tomas C. Lopes
相关产品推荐
相关产品推荐

