3

我正在使用 Doctrine 2,并希望此 ORMflush()在执行任何SELECT查询之前自动执行 EntityManager,以确保应用程序中始终保持一致性(此应用程序抽象了很多,并且不应该对 EntityManager 有任何了解,除了在存储库中)。

有没有一个选项可以用 Doctrine 做到这一点?

如果没有,有什么策略可以轻松实施吗?

4

2 回答 2

0

为什么需要在所有选择之前刷新(写入更改)?您是否可能需要事务一致性?即,插入/更新是否取决于先前选择的结果?在这种情况下,我建议使用显式事务,如下所示:

$em->transactional(function($em) {
    $entity = $em->find('Entity', 123);
    if ($entity->getValue() > 2)
    {
        $user = new User;
        $user->setName('George');
        $em->persist($user);
    }
});

如果没有,我建议坚持使用默认设置,让 unitOfWork 堆叠并在运行时结束时优化插入/更新。

于 2012-07-05T10:47:08.240 回答
0

到目前为止,我发现的唯一解决方案是在不得返回陈旧数据的存储库方法中flush()发出查询之前手动进行:SELECT

class OrderRepository
{
   public function findByUser(User $user)
    {
        $this->em->flush();

        $query = $this->em->createQuery( ... );

        // ...
    }
}

这样,刷新对使用存储库的服务隐藏。

于 2012-08-09T09:19:22.287 回答