Symfony2 Doctrine2反序列化和合并实体问题

时间:2015-01-26 04:34:35

标签: json symfony doctrine-orm jms-serializer

我正在尝试将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_serializerem->merge有关。

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

3 个答案:

答案 0 :(得分:5)

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

merge方法还会将null属性保存到数据库。

为避免这种情况,请查看以下答案:how to update symfony2/doctrine entity from a @Groups inclusion policy JMSSerializer deserialized entity

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

也相关:

答案 1 :(得分:1)

您正在以错误的方式使用Doctrine合并。它的作用不是合并的字典定义。来自Doctrine docs:

  

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

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

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

答案 2 :(得分:0)

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

$customer = $em->getRepository('CustomerBundle:Customer')
            ->findOneById($jsonParsedId);
if ($customer) {
    $customer->setCity($jsonParsedCity);
    $em->persist($customer);
    $em->flush();
}