客户在地址簿里选择省份,保存提示成功;再次编辑时省份却变空,结账又要求重新选择。Magento 地址同时存在 region_id 与 region 两种表达:有标准地区目录的国家通常保存 ID,自由输入地区的国家保存文本。主题或 API 只处理其中一个字段,就会出现“提交有值、读取没值”。
先比较请求和数据库
在 Network 中保存 customer address 请求体,核对 country_id、region_id、region_code 与 region。然后只读查询地址实体:
SELECT entity_id, parent_id, country_id, region_id, region, postcode
FROM customer_address_entity
WHERE entity_id = 456;
若请求里的 region_id 已经为空,问题在表单数据绑定或国家切换;请求正确但数据库为空,查 repository plugin、extension attribute 转换和保存异常。
确认地区 ID 属于该国家
SELECT region_id, country_id, code, default_name
FROM directory_country_region
WHERE region_id = 611;
前端切换国家后保留旧 region_id,服务端可能清理不匹配值。地址联想扩展把省份名称写进 region_id,也会被转换失败。不要通过关闭校验接受错误国家—地区组合,税率和运费都可能依赖它。
EAV 属性异常通常来自迁移或旧扩展
Magento 客户地址使用 EAV 元数据与实体表字段协作。检查 region、region_id 属性是否存在、backend/frontend 配置是否被扩展修改,以及属性是否被错误设为不可见或从 form code 移除。只有某个 website/store 失败时,还要比较表单属性集和主题覆盖。
API 数据结构必须一致
REST/GraphQL/Headless 前端常把 region 作为对象。序列化时若只保留显示名称,编辑表单重新加载后无法匹配下拉选项。定义清晰的前端模型:有 ID 时同时保存 code/name,切换国家时清空全部地区字段,再让新国家组件重建。
修复后测试标准省份国家、无省份目录国家、切换国家、默认账单/收货地址与结账中保存到地址簿。后台、客户中心和订单地址都能读到一致值,才算完成。
旧地址数据也要批量巡检
修好表单只会保证新保存的数据正确,历史地址里 country_id 与 region_id 不匹配的记录仍会在下次结账触发错误。用只读查询统计孤立 region_id,按客户和地址 ID 导出待修清单。批量修复前必须保留原文本并建立国家—地区映射,不能把所有空值统一写成一个默认省份。
还要区分客户地址与已下单地址。sales_order_address 是订单快照,修客户地址不应回写历史订单;客服需要更正履约地址时,应走订单允许的业务流程并留下记录,不能用一次 SQL 同时改两类表。

