2012-10-19 85 views
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'); 

第一查詢確實更新了數據庫行。但第二個是在執行後沒有對數據庫做任何更改。

試圖解決這個問題,我發現了一些解決方法:

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

禁用實現QueryCache兩個兩個查詢更改DB一行之後。

所以,問題是:爲什麼教義在第二個UPDATE查詢中使用第一個查詢緩存?爲什麼教義使用緩存,而它是兩個具有不同參數($ passwordHash)的查詢?

回答

1

發現問題。這是第2條ORM代碼中的一個問題。我的$用戶實體具有繼承,所以更新使用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