【问题标题】:Doctrine2 ORM Ignore relations in MergeDoctrine2 ORM 忽略合并中的关系
【发布时间】:2014-03-13 13:20:43
【问题描述】:

我正在使用 FOSRestBundle 实现 REST Api,但在修改现有实体 (PUT) 时遇到了问题

我有一个班级 Student 有一个 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 并手动将其设置为反序列化实体来躲避这种行为,但这很难看。

有没有办法告诉教义在合并中忽略分离的属性并使其始终使用存储的值?

【问题讨论】:

  • 也偶然发现了这一点,实体管理器合并意味着合并分离实体到实体,而不是合并数据到实体。您的反序列化实体以前没有分离,因此据我了解,它的合并状态不正确。您可能应该将更新的数据合并到新获取的实体 - 这甚至可以让您为实现部分更新(PATCH 方法)做好准备
  • 将数据合并到一个获取的实体的问题在于它是一种乏味且容易出错的方法。也许我应该开发一个注释和一个读取其值的服务,以了解要“合并”的女巫属性。
  • 嗯,你可以使用 hydrator->extract()、array_merge() 和 hydrator->hydrate(),amybe 和一些 array_filter 和/或 array_intersect_key 来保证它的安全。

标签: symfony doctrine-orm merge fosrestbundle


【解决方案1】:

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

JMSSerializerBundle 包含一个用于 Doctrine 实体的对象构造函数。当您启用此构造函数时,反序列化的实体是可以持久化的托管实体(使用$em->persist($student))。在反序列化实体上修改的唯一属性是请求中 JSON 中提到的属性。

Here 是启用它的方法。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多