IT Share you

교리 2 : 쿼리 작성기로 쿼리 업데이트

shareyou 2020. 11. 10. 22:37
반응형

교리 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();

다음과 같은 오류 메시지가 반환됩니다.

치명적인 오류 : '[Semantical Error] line 0, col 38 near'testusername WHERE '메시지가있는'Doctrine \ ORM \ Query \ QueryException '예외 : 오류 :'testusername '이 정의되지 않았습니다.' 에 ...

나는 어떤 도움을 기뻐할 것입니다


나는 당신 Expr함께 사용해야한다고 생각합니다 ->set()(그러나 이것은 안전하지 않으며 그렇게해서는 안됩니다) :

$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();

대신 모든 값 매개 변수를 만드는 것이 훨씬 안전합니다.

$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();

사용자가 데이터 속성으로 인쇄 된 ID와 함께 나열되는 관리자 대시 보드가있어 어느 시점에서 JavaScript를 통해 검색 할 수 있다고 가정 해 보겠습니다.

이 방법으로 업데이트를 실행할 수 있습니다.

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

Working example using Doctrine 2.5 (on top of Symfony3).

참고URL : https://stackoverflow.com/questions/4337751/doctrine-2-update-query-with-query-builder

반응형