如何配置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
相关产品推荐
相关产品推荐

