假设我按ID加载用户:
$user = $em->find('Domain\Model\User', 123);
现在运行DQL查询以选择多个用户,其中包括这个已知用户:
$users = $em->createQuery('SELECT u FROM Domain\Model\User u')->getResult();
如果用户123在这两个查询之间的数据库中发生了变化(假设我不在REPEATABLE READ
事务中),此查询是否会使用查询返回的新数据刷新用户123,或者它只是从身份图中返回对象而忽略了新数据?
答案 0 :(得分:10)
在测试了这个确切的用例之后,事实证明,Doctrine 2 不会使用DQL查询返回的数据刷新现有实体,只有会从身份返回它地图
我终于找到相关的documentation确认了这一点:
在正常操作中,将丢弃加载已存在实体数据的结果集,以支持已存在的实体。
它还提供了一种方法,使用Query::HINT_REFRESH
强制DQL查询刷新实体:
如果您指定此提示并且查询返回已由UnitOfWork管理的实体的数据,则将刷新现有实体的字段。
这非常方便易用:
use Doctrine\ORM\Query;
$users = $em->createQuery('SELECT u FROM Domain\Model\User u')
->setHint(Query::HINT_REFRESH, true)
->getResult();