加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 为什么我的doctrine2实体中的对象类型在调用persist()&am

发布时间:2020-12-13 17:06:57 所属栏目:PHP教程 来源:网络整理
导读:这是我正在做的事情: $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); 收益: obje
这是我正在做的事情:

$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(JoModelEntity)[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(JoModelEntity)[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()方法设置新对象,它与引用有关,但我不明白为什么第二个var_dump()在对象中显示正确的值.

getter非常简单,只需返回私有属性即可.

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

解决方法

我自己并不确定这种行为,但我很好奇,所以我很快就在IRC上与Jonathan Wage谈论了这个问题,Jonathan Wage是一个学说开发者.

根据Jon的说法,这种行为的原因是,当您将对象直接映射到属性时,就像您正在做的那样,您必须克隆到对象 – 换句话说,您需要一个新实例.

检查数据是否已更改时,D2会检查对象是否与旧对象相同.它基本上只是进行x === y类型比较,所以除非你有一个全新的实例,否则它不会将数据识别为已更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读