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



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

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

在我的数据库中:

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

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

$json = { "id" : 1, "city": "chicago"}
$customer = $serializer->deserialize($json, 'AppCustomerBundleEntityCustomer', '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

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

合并方法还将空属性保存到数据库。

为了避免这种情况,请查看以下答案:如何从@Groups包含策略更新symfony2/doctrine实体 JMSSerializer 反序列化实体

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

还相关:

  • 如何从序列化的 JSON 更新原则实体?
  • 如何使用实体管理器管理反序列化实体?
  • 学说2 ORM忽略合并中的关系

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

合并实体

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

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

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

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

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

相关内容

  • 没有找到相关文章