Doctrine查询缓存&更新

时间:2012-10-19 07:33:59

标签: php orm doctrine doctrine-orm

Doctrine 2查询缓存对我来说有点令人惊讶。我有两个一个接一个的更新查询:

function upd($user, $passwordHash) {
    $qb = $this->entityManager->createQueryBuilder()
        ->update(UserEntity::__class, 'u')
        ->set('u.password', '?1')
        ->where('u = ?0')
        ->setParameters(array($user, $passwordHash));
    $qb->getQuery()->execute();
}

我用2个不同的值(例如A,B)更新了密码,但用户是相同的:

upd($user, 'A');
upd($user, 'B');

第一个查询确实更新了数据库行。但是第二个在执行后没有对DB进行任何更改。

试图解决这个问题,我找到了一些解决方法:

$qb->getQuery()->useQueryCache(false)->execute();

禁用QueryCache后,两个查询都会更改DB行。

所以,问题是:为什么doctrine在第二个UPDATE查询中使用第一个查询缓存?为什么doctrine使用缓存,而它是两个带有不同参数的查询($ passwordHash)?

1 个答案:

答案 0 :(得分:2)

发现问题。这是doctrine 2 ORM代码中的一个问题。我的$ user实体具有继承,因此更新使用Doctrine \ ORM \ Query \ Exec \ MultiTableUpdateExecutor。在那个遗嘱执行人中:

//FIXME (URGENT): With query cache the parameter is out of date. Move to execute() stage.

Source

因此,现在唯一的解决方法是禁用多表更新的查询缓存:

$qb->getQuery()->useQueryCache(false)->execute();

我为它创建了new bug