2012-05-01 64 views
2

我試圖用幾種方法做到這一點,但我找不到確切的語法來工作。我的最新嘗試低於(在Symfony2的實體庫類):在教條和symfony2中的多個更新查詢

public function updateOrdering($new_order, $evaluation_id) 
{ 
    $qb = $this->createQueryBuilder('IddpRplusBundle:Answer'); 
    foreach($new_order as $item){ 
     $id = $item['id']; 
     $answernr = $item['answernr']; 
     $q = $qb->update('IddpRplusBundle:Answer a') 
       ->set('a.answernr', $answernr) 
       ->where('a.id = :id') 
       ->getQuery() 
       ->execute() 
       ; 
    } 
} 

的錯誤是「非法參數編號:綁定變量的數量不匹配令牌數」。而我也想添加第二個where子句

->where('a.evaluation_id = :evaluation_id') 

這是在MySQL表的外鍵但隨後的錯誤更改爲「無法找到evaluation_id場」,即使它存在於表本身(評價之間的關係,答案實體是一對多的,它在實體中也是這樣映射的)

任何想法?

[UPDATE]

在下面的解決方案中有一個問題。我還必須添加一個調用刷新或它將開始累積更新字段,如「更新答案集answernr = 1,answernr = 2其中id = 2」。所以最終的解決方案是:

->set('a.answernr', (int)$answernr + (int)$start) 
->where('a.id = :id AND a.evaluation = :evaluation_id ') 
       ->setParameters(array('id' => $id,'evaluation_id' => $evaluation_id)) 
       ->getQuery() 
       ->execute() 
       ; 
     $this->_em->flush(); 

回答

3

您正在爲id設置一個變量,但在執行查詢之前沒有將它綁定到某個值。

固定碼:

public function updateOrdering($new_order, $evaluation_id) 
{ 
    $qb = $this->createQueryBuilder('IddpRplusBundle:Answer'); 
    foreach($new_order as $item){ 
     $id = $item['id']; 
     $answernr = $item['answernr']; 
     $q = $qb->update('IddpRplusBundle:Answer a') 
      ->set('a.answernr', $answernr) 
      ->where('a.id = :id') 
      ->setParameter('id', $id) 
      ->getQuery() 
      ->execute(); 
    } 
} 

至於你的「evaluation_id」領域,在實體類覈對姓名,你需要在DQL撰寫查詢時,不列名稱時使用的字段名。

+0

謝謝:)最後它是這樣的: - > where('a.id =:id AND a.evaluation =:evaluation_id') - > setParameters(array('id'=> $ id ,'evaluation_id'=> $ evaluation_id)) – Sofia