Доктрина 2: оновлення запиту за допомогою конструктора запитів


74

Привіт, у мене є такий запит, але, схоже, він не працює.

$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 'не визначено.' у ...

Буду радий будь-якій допомозі

Відповіді:


148

Я думаю, вам потрібно використовувати 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
Ви завжди повинні передавати свої змінні як параметр до запиту Doctrine!
Pi Wi

7
Ви також можете use $qb->update(…)->set('u.username', $qb->createNamedParameter($username))і опустити частину -> setParameter. Це IMO найкращий спосіб. Подібним методом є -> createPositionalParameter(). Див doctrine-dbal.readthedocs.org/en/latest/reference / ...
Адріан Foder

8

Скажімо, існує адміністраційна панель, де користувачі перелічуються з їхнім ідентифікатором, надрукованим як атрибут даних, щоб його можна було отримати в певний момент через 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) .


4

З невеликою зміною у мене це спрацювало добре

$qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
               ->update()
               ->field('status')->set($status)
               ->field('id')->equals($instrumentId)
               ->getQuery()
               ->execute();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.