2013-05-31 86 views
0

我正在使用Doctrine的PHP項目。問題是實體的更新沒有經過,即數據庫沒有被更新。代碼如下所示:沒有更新的學說

// findOrGetUser does the lookup for the entity, and will create it if 
// it isn't found. $userAccount is a Doctrine entity 
$userAccount = findOrGetUser($user); 

// setAuthTok is a member function of User, defined in DataObjs.php, 
// that sets a property of User 
$userAccount->setAuthTok("hello"); 

$em->flush(); 

會發生什麼,如果實體沒有在數據庫中存在,記錄將被創建並authTok將被設置爲「Hello」。如果沒有,它將保持其先前的值(212位數字)。因此更新將通過新創建的記錄進行,但不會在更新方案中進行。

有沒有人有任何想法是怎麼回事?

DB是MySQL,我嘗試了mysqli和pdomysql驅動程序,它們都做了同樣的事情。我嘗試在flush之前添加一個persist()調用,但這沒有什麼區別。

我試着添加明確的事務處理,我也看了一下Doctrine源代碼並儘可能地追蹤它,並且找不到任何錯誤。編輯 - 我忘了提及這個代碼在測試服務器上正常工作。所以看起來問題是某種配置錯誤?

這裏是我使用的代碼試圖顯性事務處理時:

try { 
    $em->getConnection()->beginTransaction(); 
    $userAccount = findOrGetUser($user); 
    $userAccount->setAuthTok("hello"); 
    $em->persist($userAccount); 
    $em->flush(); 
    $em->getConnection()->commit(); 
} catch (Exception $ex) { 
    fileLog("(" . $ex->getFile() . " " . $ex->getLine() . ") " .$ex->getMessage()); 
    $em->getConnection()->rollback(); 
    $em->close(); 
    throw $e; 
} 
+0

只是拋出這個,但不應該''userAccount->堅持()'第一? – hank

回答

0

我知道你說你已經嘗試加入通話刷新之前,堅持(),但你不說你怎麼稱呼所以我會回答這個問題: 你需要調用$ em-> persist($ userAccount);在刷新之前,否則實體管理器無法寫入數據庫。

+0

感謝您的回覆,我在上面添加了一些我試過的代碼,其中包括您建議的調用。 –

+0

基於額外的信息:生產服務器是否使用像memcached或類似的緩存? – h00ligan