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

php – Doctrine2 Entites – 是否可以将“脏”对象与数据库中的

发布时间:2020-12-13 17:50:49 所属栏目:PHP教程 来源:网络整理
导读:是否可以比较当前“脏”版本(具有某些属性已更改但尚未保留的对象)与“原始”版本(数据仍在数据库中)之间的实体对象的状态. 我的假设是我可能有一个“脏”的对象,然后从数据库中提取一个新的对象并比较两者.例如: $entity = $em-getRepository('MyContentBu
是否可以比较当前“脏”版本(具有某些属性已更改但尚未保留的对象)与“原始”版本(数据仍在数据库中)之间的实体对象的状态.

我的假设是我可能有一个“脏”的对象,然后从数据库中提取一个新的对象并比较两者.例如:

$entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);

$editForm = $this->createContentForm($entity);
$editForm->bind($request);

if ($editForm->isValid()) {
    $db_entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);

    // compare $entity to $db_entity

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

    return $this->redirect($this->generateUrl('content_edit',array('id' => $id)));
}

但根据我的经验,$entity和$db_entity始终是相同的对象(并且在$request bind形式之后具有与$entity相同的数据).有没有办法得到一个新的版本的$实体和“脏”版本为了比较的缘故?我见过的解决方案都会在表单绑定发生之前提取所需的数据,但我宁愿没有这个限制.

更新:为了澄清,我不仅要查看实体属性的更改,还要查看其相关的实体集合.

刷新$em之后它会在数据库中发生(它被提交)..所以……你可能想要在flush()之前检索$db_entity

>我不确定你想要什么..但你也可以使用merge而不是persist.

> merge返回修改后的对象 – 生成并设置了id
> persist正在修改您的实例

>如果您想要修改对象而不是持久化,请在刷新之前使用它.
> EntityManager为您提供相同的实例,因为您没有$em-> clear()

> flush提交所有更改(所有脏对象)
>清除正在清除内存缓存.所以当你找到(…,$id)时,你会得到一个全新的实例

> clone关键字是否适合您?像在这个例子中:

$entity = $em->find('MyEntity',$id);
$clonedEntity = clone $entity;

你可能也想读这个:Implementing Wakeup or Clone

(编辑:李大同)

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

    推荐文章
      热点阅读