2013-07-23 87 views
6

成功将json字符串反序列化为具有关联的Doctrine实体后。坚持时,Doctrine始终将这些关联检测为“新实体”。我如何仅通过ID更新关联,并且如果有任何更改,不更改相关的实体值?使用JMSSerializer反序列化的关联持久化Doctrine实体

我的情况:

我有一些数据库表与静态数据。最简单的是存储单位。 (我有一个称为单位的学说实体)。该表是这样的:

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

然后,用户可以创建一个项目,其中也有被称为单元的一个服务器端的学说实体。我用一个客户端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

让我得到这个直:

当你反序列化的文字是什么单位成员的类型?是class实例array

如果我理解正确的,它是class例如,您可以设置cascademerge(未persist)上unit属性,所以你可以这样做:

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

希望这有助于...