6

在成功将 json 字符串反序列化为具有关联的 Doctrine 实体之后。在持续存在时,Doctrine 总是将这些关联检测为“新实体”。如何仅通过 ID 更新关联,而不更改相关实体值(如果有任何更改)?

我的情况:

我有一些带有静态数据的数据库表。最简单的一种是用于存储单位。(我有一个名为 Unit 的学说实体)。表格是这样的:

|id|name |ratio    |
|1 |mgr  |1      |
|2 |gr   |1000   |
|3 |Kgr  |1000000|

然后,用户可以创建一个 Item,它还有一个名为 Unit 的服务器端学说实体。我使用客户端的backbone.js 模型,更新后它会发送到我的Symfony2 应用程序,如下所示:

//Item object to be serialized into Item entity
{
  id:   13141
  weight: 100
  unit: {
      id:1
      name:mgr
      ratio:1
  }
  //many more attributes here
}

现在,我使用 JMSSerializer 反序列化,一切正常,但我希望学说只更新关系的单元 ID,而不是整个单元。

当我坚持时,教义抱怨并告诉我他找到了一个“新的单位实体”(这不是我想要的)并告诉我persist在教义实体中设置级联。但是如果我这样做并且有人修改了单位 json,那不会改变我的静态单位表吗?

例如:不良用户通过发送以下内容修改 Json:

//BAD item object to be serialized into Item entity
{
  id:   13141
  weight: 100
  unit: {
      id:1
      name:BadName //Will this get persisted to the database?
      ratio:1
  }
  //many more attributes here
}

我当然不希望这种情况发生。我只想将具有 id:1 的单元添加到项目中。

这种情况很简单,我可以通过 Id 获取单位,然后将其设置为实体,但在我的真实应用程序中,Item 实体要大得多,所以我想自动处理它。

有任何想法吗?

4

1 回答 1

4

让我说清楚:

当您反序列化文本时,单元成员的类型是什么?它class是 just 的实例array吗?

如果我理解正确并且它是class实例,您可以在属性上设置cascademerge(not persist)unit以便您可以执行以下操作:

$em = ...; // your entity manager
$item = $em->merge($item); // merge will cascade to `unit` property as well

希望这可以帮助...

于 2013-07-23T20:50:43.663 回答