繁体   English   中英

为什么调用persist() 和flush() 时我的doctrine2 实体中的object 类型没有更新?

[英]Why my object type in my doctrine2 entity doesn't get updated when calling persist() & flush()?

这是我正在做的事情:

    $entity = new Meta();
    $obj = new stdClass();
    $obj->foo = 15;
    $obj->bar = 0;
    $obj->bor = true;
    $entity->setObject($obj);
    $em->persist($entity);
    $em->flush();

    $entity = $entityRepository->find(1);
    var_dump($entity);

返回:

object(Jo\Model\Entity)[130]
  protected 'id' => int 1
  protected 'user' => null
  protected 'object' => 
    object(stdClass)[105]
      public 'foo' => int 15
      public 'bar' => int 0
      public 'bor' => boolean true

    $entity->getObject()->bar = 9;
    var_dump($entity);

返回:

object(Jo\Model\Entity)[130]
  protected 'id' => int 1
  protected 'user' => null
  protected 'object' => 
    object(stdClass)[105]
      public 'foo' => int 15
      public 'bar' => int 9
      public 'bor' => boolean true   

    $em->persist($entity);
    $em->flush();

但是在刷新之后,实体不会在数据库中更新。

也许是因为我从 getObject() 方法设置了新的 object,它与引用有关,但我不明白为什么第二个 var_dump() 在 object 中显示正确的值。

getter 非常简单,只包含返回私有属性。

任何想法,我想了解这种行为。

我自己并不确定这种行为,但我很好奇,所以我在 IRC 上与 Doctrine 开发人员之一的 Jonathan Wage 讨论了这个问题。

根据 Jon 的说法,这种行为的原因是,当您将 map 和 object 直接复制到一个属性时,就像您正在做的那样,您必须克隆到 object - 换句话说,您需要一个新实例。

在检查您的数据是否已更改时,D2 会检查 object 是否与旧的相同。 它基本上只是进行 ax === y 类型比较,因此除非您有一个全新的实例,否则它不会将数据识别为已更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM