Доктрина 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 59

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