Doctrine2のクエリキャッシングは私にとって少し驚きました。1つずつ続く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');
最初のクエリは実際にデータベース行を更新しました。しかし、2つ目は、実行後にDBに変更を加えなかっただけです。
この問題を解決しようとすると、いくつかの回避策が見つかりました。
$qb->getQuery()->useQueryCache(false)->execute();
QueryCacheを無効にすると、2つのクエリの両方でDB行が変更されます。
したがって、質問は次のとおりです。Doctrineが2番目のUPDATEクエリで1番目のクエリキャッシュを使用するのはなぜですか?そして、なぜdoctrineは異なるパラメーター($ passwordHash)を持つ2つのクエリであるのにキャッシュを使用するのですか?