只有一个自定义属性导致商品保存失败,错误却只有“输入值无效”。我先复制商品并逐项移除字段,确定问题属性 code 为 external_codes。
数据库显示它的 backend_model 指向多年前扩展中的类。这个类在 beforeSave 中假定输入永远是逗号字符串,但新后台组件提交的是数组,于是把合法值当成非法。
SELECT attribute_id, attribute_code, backend_type,
backend_model, source_model, frontend_input
FROM eav_attribute
WHERE attribute_code='external_codes';
排查顺序:
- 保存请求里的原始类型;
- UI组件是否把空值传成
[]、null或空字符串; - backend_type能否容纳转换后的值;
- backend model是否仍存在且兼容当前PHP;
- Store View保存时是否错误覆盖默认值。
不要直接在数据库里删除 backend_model 名称。它可能还负责序列化、唯一性或同步副表。应先为旧数据建立测试样本,再修改模型兼容数组/字符串并给出明确异常消息;如果确实不再需要,通过 Data Patch 安全迁移配置与现有值。
修复后测试新商品、已有商品、空值、多个值和 Store View 覆盖。再跑一次批量导入,因为导入调用同一属性后端模型,却不经过后台 UI 的数据整理。

