我正在使用FOSRestBundle实现REST Api,我遇到了修改现有实体(PUT)的问题
我有一个学生,有一个ManyToOne关系
/**
* @JMS\MaxDepth(2)
* @ORM\ManyToOne(targetEntity="ClassRoom", inversedBy="students")
* @ORM\JoinColumn(name="classroom_id", referencedColumnName="id")
*/
protected $classRoom;
执行PUT操作时,我只接收值属性,因为我不想让用户通过put请求修改关系。 这是一个收到的数据示例。
{
"id": 3,
"name": "pelayo",
"second_name": "ramon",
"last_name": "fernandez",
"birthday": "1983-08-15T00:00:00+0200"
}
使用JMS序列化程序对数据进行反序列化,将$ classRoom属性设置为null,因为它没有在接收到的数据中找到它。
执行合并时
$student2 = $this->get('doctrine')->getManager()->merge($student);
如果student2被持久化,则与classRoom的当前关系将从数据库中删除,因为合并将关系设置为null。
可以通过检索当前的classRoom并在合并之前手动将其设置为反序列化实体来避免此行为,但这很难看。
有没有办法告诉doctrine忽略合并中的属性,并使其始终使用存储的值?
答案 0 :(得分:0)
合并不是唯一的解决方案。
JMSSerializerBundle包含Doctrine实体的对象构造函数。启用此构造函数时,反序列化的实体是可以持久化的管理实体(使用{{1}})。在反序列化实体上修改的唯一属性是请求中JSON中提到的属性。
Here是您启用它的方法。