我正在使用Doctrine 2,并且希望这个ORM在执行任何flush()
查询之前自动SELECT
EntityManager,以确保应用程序内的所有时间一致(此应用程序抽象很多,除了存储库内部之外,不应该对EntityManager有任何了解。
是否可以选择使用Doctrine进行此操作?
如果没有,任何策略都可以轻松实现吗?
答案 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( ... );
// ...
}
}
这样,刷新对使用存储库的服务是隐藏的。