Doctrine2 ORM忽略Merge中的关系

时间:2014-03-13 13:20:43

标签: symfony doctrine-orm merge fosrestbundle

我正在使用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忽略合并中的属性,并使其始终使用存储的值?

1 个答案:

答案 0 :(得分:0)

合并不是唯一的解决方案。

JMSSerializerBundle包含Doctrine实体的对象构造函数。启用此构造函数时,反序列化的实体是可以持久化的管理实体(使用{{1}})。在反序列化实体上修改的唯一属性是请求中JSON中提到的属性。

Here是您启用它的方法。