2

これをいくつかの方法で実行しようとしましたが、機能するための正確な構文が見つかりません。私の最新の試みは以下のとおりです (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()
                ;
    }
}

エラーは「無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません」..また、2 つ目の where 句を追加したいと思います

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

これはmysqlテーブルの外部キーですが、テーブル自体に存在するにもかかわらず、エラーは「評価IDフィールドが見つかりません」に変わります(評価エンティティと回答エンティティの関係は1対多であり、エンティティも同様)

何か案は?

[アップデート]

以下のソリューションには落とし穴がありました。また、フラッシュへの呼び出しを追加する必要がありました。そうしないと、「update answer set 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();
4

1 に答える 1

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 でクエリを作成するときにフィールド名を使用する必要があります。

于 2012-05-01T23:28:52.730 に答える