4

我可以在 Symfony 中保存单个实体,而不刷新所有更改吗?例如。

$em = $this->getDoctrine();
$entity1 = $em->find('\SomeEntity', 1);
$entity2 = $em->find('\SomeEntity', 2);
$entity1->setFoo(1);
$entity1->persist();
$entity2->setFoo(2);
$this->saveRightNow($entity2); // entity2 is written to the DB at this point
$em->flush(); // entity1 is written to the DB at this point

查看源代码,似乎我可以使用Doctrine\ORM\UnitOfWork::commit

function saveRightNow($entity) {
    $em = $this->getDoctrine();
    $uow = $em->getUnitOfWork();
    $uow->commit($entity);
}

但我找不到任何关于使用commit这种方式的文档(也没有太多关于使用它的信息,即使它没有被标记为内部函数)。这是一个好主意吗?它有什么危险吗?

4

2 回答 2

0

我们所有的实体都是名为 Entity.php 的超类的子类,它具有如下功能:

public function save($flush = TRUE)
{
    try {
        self::getEntityManager()->persist($this);

        if ($flush) {
            self::getEntityManager()->flush();
        }
    } catch (\Exception $e) {
        return $e;
    }

    return TRUE;
}

对 getEntityManager 的引用可以提供您最喜欢的获取 EntityManager 的方法(我们将我们的方法保存到 Zend_Registry 中)。

于 2015-07-09T04:14:40.520 回答
0

此外,如果这是一个老问题,也许回复可能对其他人有用,因为这是 Google 显示的第一个问题。

所以,你不能flush一个单一的实体,但你可以detach

因此,在您的特定情况下,您可以执行以下操作:

$em = $this->getDoctrine();
$entity1 = $em->find('\SomeEntity', 1);
$entity2 = $em->find('\SomeEntity', 2);
$entity1->setFoo(1);
$entity2->setFoo(2);

// At this point start the "new" code
// So, first detach $entity2
$em->detach($entity2); // Now the EntityManager doesn't know anymore of $entity2
$em->flush(); // entity1 is written to the DB at this point

// Add again $entity2 to the EntityManager
$em->persist($entity2);
$em->flush();

显然,这是一个非常简单的例子。

在实际用例中,可能您已将 2 个以上的实体加载到 EntityManager 中。在这种情况下,如果您detach($entity2)可能是第一个 EntityManagerflush()也会将对其他加载的实体所做的修改保存到数据库中。

因此,必须小心使用此解决方案。

另一种解决方案可能是使用clear(): 这将分离所有托管实体。它与刚刚初始化的新 EntityManager 非常相似。

我最近使用了最后一个解决方案来仅保存具有一些不必保存的相关实体的实体的部分数据。

所以我:

  1. 首先清除实体管理器;
  2. 然后重新加载我正在更新的实体;
  3. 进行了相关修改;
  4. 刷新了 EntityManager

进行非常具体的刷新可能有点复杂,当然,有一种方法来只保存部分实体会很有帮助。

但就目前而言,这些方法是唯一可能的方法。

于 2017-01-27T12:19:35.487 回答