Доктрина 2. Обновление запроса с помощью построителя запросов - PullRequest
67 голосов
/ 02 декабря 2010

Привет У меня есть следующий запрос, но он, похоже, не работает.

$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» с сообщением «[Семантическая ошибка], строка 0, столбец 38 рядом с« testusername WHERE »: Ошибка:« testusername »не определено».в ...

Буду рад любой помощи

Ответы [ 2 ]

129 голосов
/ 02 декабря 2010

Я думаю, вам нужно использовать 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();
6 голосов
/ 19 апреля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...