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

Это возвращает следующее сообщение об ошибке:

Неустранимая ошибка: исключение «Doctrine \ ORM \ Query \ QueryException» с сообщением '[Semantical Error] строка 0, col 38 около' testusername WHERE ': Ошибка:' 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(); 

Допустим, у вас есть несколько бэкэнд, показывающих список пользователей (доступный для нескольких администраторов, у которых может быть доступ на чтение и запись на детали пользователей) .
Там вы можете распечатать идентификатор пользователя в своей строке как атрибут данных, чтобы получить его из 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 … # 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 } # … 

Рабочий пример с использованием Doctrine 2.5 (поверх Symfony3) .