2012-10-19 3 views
1

Doctrine 2 쿼리 캐싱은 나에게 조금 놀라운 것입니다.Doctrine 쿼리 캐시 및 업데이트

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(); 
} 

내가 갱신이 개 다른 값 (. 예 A, B)와 비밀번호 만, 사용자가 동일한했다 : 나는 하나씩 따라이 업데이트 쿼리를했다

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

첫 번째에게 쿼리는 실제로 데이터베이스 행을 업데이트합니다. 그러나 두 번째는 실행 후 DB에 변경 사항을 적용하지 않았습니다. DB 행을 변경 QueryCache 두 개의 쿼리를 해제 한 후

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

이 문제를 해결하기 위해 노력

나는 몇 가지 해결 방법을 발견했다.

따라서 질문은 다음과 같습니다. 왜 doctrine은 두 번째 UPDATE 쿼리에서 첫 번째 쿼리 캐시를 사용합니까? 그리고 doctrine이 다른 매개 변수 ($ passwordHash)를 가진 두 개의 쿼리 인 동안 캐시를 사용하는 이유는 무엇입니까?

답변

1

문제가 발견되었습니다. Doctrine 2 ORM 코드의 문제입니다. My $ 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을 만들었습니다.

+0

Doctrine2 ORM 2.3.3 이상부터 수정 됨 – ocornu