2010-12-02 5 views
52

안녕 다음 쿼리가 있지만 작동하지 않습니다.Doctrine 2 : 쿼리 작성기로 쿼리 업데이트

$q = $this->em->createQueryBuilder() 
    ->update('models\User', 'u') 
    ->set('u.username', $username) 
    ->set('u.email', $email) 
    ->where('u.id = ?1') 
    ->setParameter(1, $editId) 
    ->getQuery(); 
$p = $q->execute(); 

이 다음과 같은 오류 메시지가 반환

$qb = $this->em->createQueryBuilder(); 
$q = $qb->update('models\User', 'u') 
     ->set('u.username', $qb->expr()->literal($username)) 
     ->set('u.email', $qb->expr()->literal($email)) 
     ->where('u.id = ?1') 
     ->setParameter(1, $editId) 
     ->getQuery(); 
$p = $q->execute(); 

중 하나를 :

Fatal error: Uncaught exception 'Doctrine\ORM\Query\QueryException' with message '[Semantical Error] line 0, col 38 near 'testusername WHERE': Error: 'testusername' is not defined.' in ...

내가

답변

110

난 당신이 ->set()Expr를 사용할 필요가 있다고 생각 도움의 기쁠을 또는 모든 값 매개 변수를 만드십시오 :

$qb = $this->em->createQueryBuilder(); 
$q = $qb->update('models\User', 'u') 
     ->set('u.username', '?1') 
     ->set('u.email', '?2') 
     ->where('u.id = ?3') 
     ->setParameter(1, $username) 
     ->setParameter(2, $email) 
     ->setParameter(3, $editId) 
     ->getQuery(); 
$p = $q->execute(); 
+2

Doctrine 쿼리에 매개 변수로 변수를 전달해야합니다! –

+0

또한 일대 다 업데이트에 대한 예제를 제공 할 수 있습니까? –

+4

당신은 또한''$ qb-> update (...) -> set ('u.username', $ qb-> createNamedParameter ($ username))''을 사용하고 -> setParameter 부분을 생략 할 수 있습니다. 그것은 IMO가 가장 좋은 방법입니다. 비슷한 방법은''-> createPositionalParameter()''입니다. http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#binding-parameters-to-placeholders를 참조하십시오. –

5

의 당신이 사용자 (사용자 정보에 읽기/쓰기 액세스 권한이 있습니다 몇 관리자 액세스) 의 목록을 보여주는 몇 가지 백엔드 있다고 가정 해 봅시다.
일부 이벤트가 트리거되는 동안 Javascript에서 검색하기 위해 사용자 ID를 자체 행에 데이터 속성으로 인쇄 할 수 있습니다. 이어서 업데이트이 방법을 실행할 수

... 교리 2.5 사용 예를 작업

class UserRepository extends \Doctrine\ORM\EntityRepository { public function updateUserStatus($userId, $newStatus) { return $this->createQueryBuilder('u') ->update() ->set('u.isActive', '?1') ->setParameter(1, $qb->expr()->literal($newStatus)) ->where('u.id = ?2') ->setParameter(2, $qb->expr()->literal($userId)) ->getQuery()->getSingleScalarResult(); } 

그리고 (AJAX) 운반 작업 내부

...

# Post datas may be handled with a specific custom formType 
    # … OR … 
    # Directly retrieved from request object 
    $userId = (int)$request->request->get('userId'); 
    $newStatus = (int)$request->request->get('newStatus'); 
    $em = $this->getDoctrine()->getManager(); 
    $r = $em->getRepository('NAMESPACE\User') 
      ->updateUserStatus($userId, $newStatus); 
    if (!empty($r)){ 
     # Row updated 
    } 
    # … 

(Symfony3 위에).