Доктрина 2: Обновление запроса с помощью построителя запросов
Привет У меня есть следующий запрос, но он, кажется, не работает.
$q = $this->em->createQueryBuilder()
->update('modelsUser', 'u')
->set('u.username', $username)
->set('u.email', $email)
->where('u.id = ?1')
->setParameter(1, $editId)
->getQuery();
$p = $q->execute();
Это возвращает следующее сообщение об ошибке:
фатальная ошибка: Неперехваченные исключения 'DoctrineORMQueryQueryException' с сообщением ' [семантическая ошибка] строка 0, col 38 возле 'testusername WHERE': Ошибка:' testusername ' не определен.' в...
Я был бы рад любой помощи
2 ответа:
Я думаю, что вы должны использовать
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 } # …
рабочий пример с использованием Доктрина 2.5 (поверх Symfony3).