programing

원칙 2: 쿼리 작성기를 사용하여 쿼리 업데이트

copyandpastes 2023. 1. 2. 23:21
반응형

원칙 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();

그러면 다음 오류 메시지가 반환됩니다.

치명적인 오류:검출되지 않은 예외 'Doctrine\'ORM\쿼리\QueryException'과 함께 '[Semantical Error]행 0, col 38, wHERE 근처의 'testusername WHERE: 오류: 'testusername'이 정의되지 않았습니다.'라는 메시지가 표시됩니다.

도움이 된다면 고맙겠다

내 생각엔 네가 이걸 써야 할 것 같아.->set()모든 값 매개변수를 설정하는 것이 훨씬 안전합니다.

$queryBuilder = $this->em->createQueryBuilder();
$query = $queryBuilder->update('models\User', 'u')
        ->set('u.username', ':userName')
        ->set('u.email', ':email')
        ->where('u.id = :editId')
        ->setParameter('userName', $userName)
        ->setParameter('email', $email)
        ->setParameter('editId', $editId)
        ->getQuery();
$result = $query->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
}

원칙 2.5(Symfony3 위에 있음)를 사용한 작업 예.

잔돈만 조금 바꿔도 잘 됐다

$qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
               ->update()
               ->field('status')->set($status)
               ->field('id')->equals($instrumentId)
               ->getQuery()
               ->execute();

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

반응형