2

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つのクエリであるのにキャッシュを使用するのですか?

4

1 に答える 1

2

問題が見つかりました。これは、ドクトリン2ORMコードの問題です。$ userエンティティには継承があるため、更新ではDoctrine \ ORM \ Query \ Exec\MultiTableUpdateExecutorを使用します。そのエグゼキュータでは:

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

ソース

したがって、現時点での唯一の回避策は、マルチテーブル更新のクエリキャッシュを無効にすることです。

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

新しいバグを作成しました。

于 2012-10-19T13:48:50.353 に答える