Doctrine orm DQL查询是否刷新标识映射中已有的实体?

Doctrine orm DQL查询是否刷新标识映射中已有的实体?,doctrine-orm,Doctrine Orm,假设我按id加载用户: $user=$em->find('Domain\Model\user',123); 现在运行一个DQL查询来选择几个用户,其中包括这个已知的用户: $users=$em->createQuery('SELECT u FROM Domain\Model\User u')->getResult(); 如果用户123在这两个查询之间的数据库中发生了变化(假设我不在可重复读取的事务中),那么这个查询会用查询返回的新数据刷新用户123,还是只从标识图返回对象而忽略新数据?在测试

假设我按id加载用户:

$user=$em->find('Domain\Model\user',123);
现在运行一个DQL查询来选择几个用户,其中包括这个已知的用户:

$users=$em->createQuery('SELECT u FROM Domain\Model\User u')->getResult();

如果用户123在这两个查询之间的数据库中发生了变化(假设我不在可重复读取的事务中),那么这个查询会用查询返回的新数据刷新用户123,还是只从标识图返回对象而忽略新数据?

在测试完这个确切的用例之后,事实证明,条令2不会使用DQL查询返回的数据刷新现有实体,而只从身份映射中返回它的原样

我终于找到了相关的证据来证实这一点:

在正常操作中,加载已存在实体的数据的结果集将被丢弃,取而代之的是已存在的实体

它还提供了一种使用
query::HINT\u refresh
强制DQL查询刷新实体的方法:

如果指定此提示,并且查询返回已由UnitOfWork管理的实体的数据,则将刷新现有实体的字段

它非常方便且易于使用:

使用条令\ORM\Query;
$users=$em->createQuery('从域\模型\用户u'中选择u')
->setHint(查询::提示\刷新,true)
->getResult();