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

Ben*_*min 3 doctrine-orm

假设我按ID加载用户:

$user = $em->find('Domain\Model\User', 123);
Run Code Online (Sandbox Code Playgroud)

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

$users = $em->createQuery('SELECT u FROM Domain\Model\User u')->getResult();
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*min 10

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

我终于找到了证实这一点的相关文件:

在正常操作中,丢弃加载已存在实体的数据的结果集,以有利于已经存在的实体.

它还提供了一种强制DQL查询刷新实体的方法,使用Query::HINT_REFRESH:

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

这非常方便易用:

use Doctrine\ORM\Query;

$users = $em->createQuery('SELECT u FROM Domain\Model\User u')
    ->setHint(Query::HINT_REFRESH, true)
    ->getResult();
Run Code Online (Sandbox Code Playgroud)