DQL查询是否刷新了身份映射中已有的实体?

时间:2014-12-04 14:59:16

标签: doctrine-orm

假设我按ID加载用户:

$user = $em->find('Domain\Model\User', 123);

现在运行DQL查询以选择多个用户,其中包括这个已知用户:

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

如果用户123在这两个查询之间的数据库中发生了变化(假设我不在REPEATABLE READ事务中),此查询是否会使用查询返回的新数据刷新用户123,或者它只是从身份图中返回对象而忽略了新数据?

1 个答案:

答案 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();