Doctrine 2: Update query with query builder

后端 未结 3 2055
无人及你
无人及你 2020-12-08 08:57

Hi I\'ve got the following query but it doesn\'t seem to work.

$q = $this->em->createQueryBuilder()
    ->update(\'models\\User\', \'u\')
    ->s         


        
相关标签:
3条回答
  • 2020-12-08 09:24

    Let's say there is an administrator dashboard where users are listed with their id printed as a data attribute so it can be retrieved at some point via JavaScript.

    An update could be executed this way …

    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 action handling:

    # 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).

    0 讨论(0)
  • I think you need to use Expr with ->set() (However THIS IS NOT SAFE and you shouldn't do it):

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

    It's much safer to make all your values parameters instead:

    $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();
    
    0 讨论(0)
  • 2020-12-08 09:43

    With a small change, it worked fine for me

    $qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
                   ->update()
                   ->field('status')->set($status)
                   ->field('id')->equals($instrumentId)
                   ->getQuery()
                   ->execute();
    
    0 讨论(0)
提交回复
热议问题