我正在使用 Doctrine 2,并希望此 ORMflush()
在执行任何SELECT
查询之前自动执行 EntityManager,以确保应用程序中始终保持一致性(此应用程序抽象了很多,并且不应该对 EntityManager 有任何了解,除了在存储库中)。
有没有一个选项可以用 Doctrine 做到这一点?
如果没有,有什么策略可以轻松实施吗?
我正在使用 Doctrine 2,并希望此 ORMflush()
在执行任何SELECT
查询之前自动执行 EntityManager,以确保应用程序中始终保持一致性(此应用程序抽象了很多,并且不应该对 EntityManager 有任何了解,除了在存储库中)。
有没有一个选项可以用 Doctrine 做到这一点?
如果没有,有什么策略可以轻松实施吗?
为什么需要在所有选择之前刷新(写入更改)?您是否可能需要事务一致性?即,插入/更新是否取决于先前选择的结果?在这种情况下,我建议使用显式事务,如下所示:
$em->transactional(function($em) {
$entity = $em->find('Entity', 123);
if ($entity->getValue() > 2)
{
$user = new User;
$user->setName('George');
$em->persist($user);
}
});
如果没有,我建议坚持使用默认设置,让 unitOfWork 堆叠并在运行时结束时优化插入/更新。
到目前为止,我发现的唯一解决方案是在不得返回陈旧数据的存储库方法中flush()
发出查询之前手动进行:SELECT
class OrderRepository
{
public function findByUser(User $user)
{
$this->em->flush();
$query = $this->em->createQuery( ... );
// ...
}
}
这样,刷新对使用存储库的服务隐藏。