You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Symfony序列化器,反序列化时关联关系字段到已有行?

JSON批量导入数据库时关联字段反序列化异常问题

目标

将大量JSON文件数据导入数据库,保留JSON文件中的id字段值,并将关联ID关联到数据库中已有的行。

问题

反序列化关联字段时,序列化器会插入新的空记录,而非关联到已有行。

背景

正在将文件反序列化为对应的实体对象,以Region.json为例,其对应Region实体,与Country实体为多对一(ManyToOne)关系。

Region.json片段(字段与实体属性一致)

[
 {
   "id": 1,
   "name": "Aera",
   "code": "AR",
   "country": 1, // 关联字段
   "isActive": true
 },
 {
   "id": 2,
   "name": "Mauw",
   "code": "MW",
   "country": 8, // 关联字段
   "isActive": true
 }
]

反序列化流程代码

public function getDeserializeData(): mixed
{
    $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
    $normalizers = [new ObjectNormalizer( classMetadataFactory: $classMetadataFactory,propertyTypeExtractor: new ReflectionExtractor()), new GetSetMethodNormalizer(), new ArrayDenormalizer()];
    $encoders = [new JsonEncoder(), new XmlEncoder(), new CsvEncoder()];

    $serializer = new Serializer(
        normalizers: $normalizers,
        encoders: $encoders
    );

    return $serializer->deserialize(
        $this->staticDataFile->getContents(),
        $this->getEntityNamespace() . '[]',
        $this->staticDataFile->getExtension()
    );
}

由于JSON文件中的id是预定义且不可修改的,使用了ReflectionExtractor。若将生成值策略从IDENTITY改为NONE,会触发以下错误:

类型为App\Entity\Country的实体缺少字段'id'的分配ID。该实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果需要自动生成标识符,请相应调整元数据映射。


内容的提问来源于stack exchange,提问作者Kerrial Newham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:10:33