php - Doctrine查询缓存和更新

标签 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');

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

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

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

禁用 QueryCache 后,两个查询都会更改数据库行。

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

最佳答案

发现问题。这是 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为了它。

关于php - Doctrine查询缓存和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12969460/

相关文章:

php - 扩展 Sonata User Bundle 并添加新字段

php - 基于值构建嵌套数组

java - Hibernate 一对一单向更新

php - 级联坚持不工作(Doctrine ORM + Symfony 2)

php - Doctrine multiple OneToMany/ManyToOne 双向完整性约束违反

jquery - Symfony - 使用 Doctrine 创建复杂查询

php - 无法在 php/mysql 中上传图片

python - 无法从ManyToManyField获取相关数据

symfony - ArrayCollection 上的条件表达式区分大小写

javascript - 使用 PHP 在 tmux session 中运行命令