Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2实体-是否可以比较;肮脏的;对象从数据库中选择一个_Php_Symfony_Doctrine Orm_Doctrine Odm - Fatal编程技术网

Php Doctrine2实体-是否可以比较;肮脏的;对象从数据库中选择一个

Php Doctrine2实体-是否可以比较;肮脏的;对象从数据库中选择一个,php,symfony,doctrine-orm,doctrine-odm,Php,Symfony,Doctrine Orm,Doctrine Odm,是否可以将实体对象的状态在当前“脏”版本(某些属性已更改但尚未持久化的对象)和“原始”版本(数据仍在数据库中)之间进行比较 我的假设是,我可以拥有一个“脏”对象,然后从DB中提取一个新对象,并将两者进行比较。例如: $entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id); $editForm = $this->createContentForm($entity); $editForm-

是否可以将实体对象的状态在当前“脏”版本(某些属性已更改但尚未持久化的对象)和“原始”版本(数据仍在数据库中)之间进行比较

我的假设是,我可以拥有一个“脏”对象,然后从DB中提取一个新对象,并将两者进行比较。例如:

$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绑定后与$entity具有相同的数据)。为了便于比较,有没有一种方法可以将$entity的新版本与“脏”版本放在一起?我看到的解决方案都是在表单绑定之前提取所需的数据,但我不希望有这种限制


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

您可以通过Doctine的UnityOfWork了解实体的变化。很简单:在持久化实体之后,Doctrine知道要在数据库中更新什么。您可以通过以下操作获得这些信息:

// Run these AFTER persist and BEFORE flush
$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeset = $uow->getEntityChangeSet($entity);

刷新
$em
后,它会在数据库中发生(提交)。。所以您可能希望在
flush()之前检索
$db\u实体


  • 我不知道你想要什么。。但是您也可以使用
    merge
    而不是
    persist

    • merge
      正在返回已修改的对象-生成并设置的id
    • persist
      正在修改您的实例
  • 如果您希望修改对象而不保留
    对象,请在
    刷新之前使用它

  • EntityManager
    正在为您提供相同的实例,因为您没有
    $em->clear()
    • flush
      正在提交所有更改(所有
      dirty
      对象)
    • clear
      正在清除内存缓存。因此,当您
      找到(…,$id)
      时,您将得到一个全新的实例
  • clone
    关键字是否适合您?如本例所示:


  • 您可能还想阅读以下内容:

    我特别提出了这一要求,以便我能够为从Symfony2表单集合中删除项目提供更好的解决方案。在绑定之前提取值似乎太有限,不利于创建一个好的函数来处理它。这是我的重复,我应该扩展我的问题的范围,因为我不仅要查看对实体本身的更改,还要查看对实体内相关集合的更改。使用UnitOfWork仅对前者有帮助。但是,看起来Alex建议在执行另一个find()之前使用$em->clear()将获得我正在寻找的“新鲜”实体。这在刷新周期之外是不可能的(如果不丢失当前管理的实体),您可能需要检查,您将无法以非肮脏的方式获得比我回答的更多的内容…哇,我的例子不好,我已经更新了。$db_实体应在persist()和flush()之前检索。即使这样做,$entity和$db_entity也是一样的。在我的帖子中添加了另一个解决方案(克隆部分),这可以在控制器中调用吗?因为当我尝试此操作时,它不会显示我的实体的任何更改(只是空数组)。请确保您阅读了本文中与此方法相关的警告:
    $entity = $em->find('My\Entity', $id);
    $clonedEntity = clone $entity;