2014-12-04 48 views
3

说我通过ID加载用户:DQL查询是否刷新了身份映射中已存在的实体?

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

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

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

如果用户123已经改变这两个查询之间的数据库(假设我不在REPEATABLE READ事务中),这个查询将使用查询返回的新数据刷新用户123,还是仅仅从身份映射返回对象而忽略新数据?

回答

10

测试这个确切使用情况后,事实证明,原则2 不刷新现有实体与由DQL查询返回的数据,只有回报它是从身份地图

我终于找到了相关documentation证实这一点:

在正常运行的结果,设置一个已经存在的实体的负载数据有利于现有的实体将被丢弃。

它还提供了一种方式来迫使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();