5

我正在尝试将 json 反序列化为实体,然后合并实体。

我相信我过去曾做过这个工作,我会发送 ID 和我希望更新的任何字段。例如:

在我的数据库中:

| id |  first  | last  |   city   |
|  1 |  Jimmy  | James | Seattle  |

然后我将反序列化以下 json 并合并实体

$json = { "id" : 1, "city": "chicago"}
$customer = $serializer->deserialize($json, 'App\CustomerBundle\Entity\Customer', 'json');
$em->merge($customer);

预期的结果是:

| id |  first  | last  |   city   |
|  1 |  Jimmy  | James | Chicago  |

但是我得到以下信息:

| id |  first  | last  |   city   |
|  1 |  null   | null  | Chicago  |

就像我说的那样,我相信我在某个时候有这个工作,我不确定这是否与jms_serializeror相关em->merge

$customer->getFirst()在实体合并之前和之后返回 null

4

3 回答 3

5

反序列化器将您的 JSON 字符串转换为一个对象,仅此而已。它将使用您序列化的属性。如果未设置属性,它将保持为空(或您的类中指定的默认值)。

合并方法还将空属性持久化到数据库。

为避免这种情况,请查看以下答案:how to update symfony2/doctrine entity from a @Groups 包含策略 JMSSerializer 反序列化实体

持久化实体后,在实体上调用 EntityManager::refresh() 方法应该会加载缺失的属性。

也相关:

于 2015-01-27T11:04:33.793 回答
1

您以错误的方式使用 Doctrine 合并。它所做的不是合并的字典定义。从教义文档:

合并实体是指将(通常是分离的)实体合并到 EntityManager 的上下文中,以便它们再次被管理。要将实体的状态合并到 EntityManager 中,请使用 EntityManager#merge($entity) 方法。传递的实体的状态将被合并到该实体的托管副本中,该副本随后将被返回。

链接:http ://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#merging-entities

您可能应该一一更新 $customer 的值。

于 2015-01-26T08:50:57.090 回答
0

不是非常优雅,但我认为这可以完成工作。

$customer = $em->getRepository('CustomerBundle:Customer')
            ->findOneById($jsonParsedId);
if ($customer) {
    $customer->setCity($jsonParsedCity);
    $em->persist($customer);
    $em->flush();
}
于 2015-01-27T16:14:12.440 回答