gpt4 book ai didi

symfony - 如何从序列化的 JSON 更新 Doctrine 实体?

转载 作者:行者123 更新时间:2023-12-04 04:49:15 25 4
gpt4 key购买 nike

我们正在使用 Symfony2 来创建 API。更新记录时,我们希望 JSON 输入代表一个序列化的更新实体。 JSON 数据将不包含某些字段(例如, CreatedAt 应仅在创建实体时设置一次 - 并且永不更新)。例如,这是一个 JSON PUT 请求示例:

{"id":"1","name":"anyname","description":"anydescription"}

这是 Controller 上的 PHP 代码,它应该根据上面的 JSON 更新实体(我们使用的是 JMS 序列化程序包):
$supplier = $serializer->deserialize(
$this->get('request')->getContent(),
'WhateverEntity',
'json'
);

EntityManger 理解(正确)这是一个更新请求(实际上,一个 SELECT 查询是隐式触发的)。 EntityManager 还猜测(不正确) CreatedAt 属性应该是 NULLified - 它应该保留前一个。

如何解决这个问题?

最佳答案

我会使用 Doctrine\ORM\Mapping\ClassMetadata用于发现实体中现有字段的 API。
您可以执行以下操作(我不知道 JMSSerializerBundle 是如何工作的):

//Unserialize data into $data
$metadata = $em->getMetadataFactory()->getMetadataFor($FQCN);
$id = array();
foreach ($metadata->getIdentifierFieldNames() as $identifier) {
if (!isset($data[$identifier])) {
throw new InvalidArgumentException('Missing identifier');
}
$id[$identifier] = $data[$identifier];
unset($data[$identifier]);
}
$entity = $em->find($metadata->getName(), $id);
foreach ($metadata->getFieldNames() as $field) {
//add necessary checks about field read/write operation feasibility here
if (isset($data[$field])) {
//careful! setters are not being called! Inflection is up to you if you need it!
$metadata->setFieldValue($entity, $field, $data[$field]);
}
}
$em->flush();

关于symfony - 如何从序列化的 JSON 更新 Doctrine 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8726611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com