2012-05-01 16 views
2

私はいくつかの点でこれを試みましたが、動作するための正確な構文が見つかりません。私の最新の試みは(Symfony2のエンティティリポジトリのクラスで)以下である:doctrineと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() 
       ; 
    } 
} 

エラーがある:..「無効なパラメータ番号バインドされた変数の数は、トークンの数と一致しません」と私もしたいと思いますその後、MySQLのテーブルの外部キーである句

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

が、エラーの変更は、それがテーブル自体(評価との関係に存在していても「EVALUATION_IDフィールドを見つけることができない」ことがどこ秒を追加し、回答エンティティは1対多であり、それはエンティティ内でも同様にマッピングされます)

アイデア?

[UPDATE]

は、以下の溶液中の落とし穴がありました。また、flushへの呼び出しを追加しなければなりませんでした。または、このような更新フィールドを累積するようになりました。 "Answer答えのセットanswernr = 1、answernr = 2 where 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の変数を設定することができますが、クエリを実行する前の値にバインドされていません。

固定コード:あなたの「EVALUATION_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(); 
    } 
} 

、エンティティクラスに名前を確認するには、列名、DQLでクエリを作成するとき、フィールド名を使用する必要はありません。

+0

ありがとうございました:)このようになりました。 - >ここで( 'a.id =:idとa.evaluation =:evaluation_id') - > setParameters(array( 'id' => $ id 、 'evaluation_id' => $ evaluation_id)) – Sofia

関連する問題