使用JMSSerializer反序列化的关联持久化Doctrine实体

时间:2013-07-23 17:12:16

标签: symfony backbone.js doctrine jmsserializerbundle

成功将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进行反序列化,一切正常,但我希望doctrine只更新关系的Unit ID,而不是整个Unit。

当我坚持时,教义抱怨并告诉我他找到了一个“新单位实体”(这不是我想要的)并告诉我在学说实体中设置级联到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实体要大得多,所以我想自动处理它。

¿任何想法?

1 个答案:

答案 0 :(得分:4)

让我直截了当地说:

当您反序列化文本时,单位成员的类型是什么?只是class的{​​{1}}个实例?

如果我理解正确并且它是array个实例,您可以在class属性上将cascade设置为merge(而不是persist),这样您就可以:

unit

希望这会有所帮助......