2012-05-01 3 views
2

여러 가지 방법으로 시도했지만 올바르게 작동하는 구문을 찾을 수 없습니다. 내 최신 시도의 (a 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() 
       ; 
    } 
} 

오류는 "잘못된 매개 변수 번호 : 바운드 변수의 수는 토큰의 수와 일치하지 않습니다"..을 그리고 나 또한 싶습니다 추가 두 번째 where 절 외국 MySQL의 테이블에 키하지만 오류 변경은 테이블 자체 (평가의 관계에있는 경우에도 "를 evaluation_id 필드를 찾을 수 없습니다"하는 것입니다

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

및 답변 엔티티는 일대 다 많고 엔티티에서도 매핑됩니다.)

아이디어가 있으십니까?

[업데이트]

아래 해결 방법에 문제가 있습니다. 나는 또한 flush에 대한 호출을 추가해야했는데, "update answer_required = 1, answernr = 2 where id = 2"와 같은 업데이트 필드를 누적하기 시작할 것입니다. 그래서 최종 솔루션이었다 : 당신은 ID에 대한 변수를 설정,하지만 당신은 쿼리를 실행하기 전에 값으로 바인딩되지 않습니다

->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

.

고정 코드 :

당신의 "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 AND a.evaluation = : evaluation_id') -> setParameters (array ('id'=> $ id , 'evaluation_id'=> $ evaluation_id)) – Sofia