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类型比较,所以除非你有一个全新的实例,否则它不会将数据识别为已更改. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |