如何在Doctrine 2中自动刷新?

时间:2012-07-04 20:20:49

标签: php orm doctrine-orm

我正在使用Doctrine 2,并且希望这个ORM在执行任何flush()查询之前自动SELECT EntityManager,以确保应用程序内的所有时间一致(此应用程序抽象很多,除了存储库内部之外,不应该对EntityManager有任何了解。

是否可以选择使用Doctrine进行此操作?

如果没有,任何策略都可以轻松实现吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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

        // ...
    }
}

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