我们正在使用Symfony2来创建API.更新记录时,我们希望JSON输入表示序列化更新的实体.JSON数据将不包含某些字段(例如,创建实体时,CreatedAt只应设置一次 - 并且永远不会更新).例如,这是一个示例JSON PUT请求:
{"id":"1","name":"anyname","description":"anydescription"}
Run Code Online (Sandbox Code Playgroud)
这是Controller上的PHP代码,它应该根据上面的JSON更新实体(我们使用的是JMS序列化器Bundle):
$supplier = $serializer->deserialize(
$this->get('request')->getContent(),
'WhateverEntity',
'json'
);
Run Code Online (Sandbox Code Playgroud)
EntityManger(正确地)理解这是一个更新请求(实际上,隐式触发了SELECT查询).EntityManager还猜测(不正确)CreatedAt属性应该被NULL化 - 它应该保留前一个属性.
如何解决这个问题?
我试图将json反序列化为实体,然后合并实体.
我相信我过去有这个工作,我会发送ID和我希望更新的任何字段.例如:
在我的DB中:
| id | first | last | city |
| 1 | Jimmy | James | Seattle |
Run Code Online (Sandbox Code Playgroud)
然后我将反序列化以下json并合并实体
$json = { "id" : 1, "city": "chicago"}
$customer = $serializer->deserialize($json, 'App\CustomerBundle\Entity\Customer', 'json');
$em->merge($customer);
Run Code Online (Sandbox Code Playgroud)
预期的结果将是:
| id | first | last | city |
| 1 | Jimmy | James | Chicago |
Run Code Online (Sandbox Code Playgroud)
但是我得到以下内容:
| id | first | last | city |
| 1 | null | null | Chicago |
Run Code Online (Sandbox Code Playgroud)
就像我说的,我相信我在某些时候有这个工作,我不确定这是否与jms_serializeror有关em->merge.
$customer->getFirst() …