Lehre 2: Aktualisieren Sie die Abfrage mit dem Abfragegenerator

Lesezeit: 2 Minuten

Hallo, ich habe die folgende Abfrage, aber es scheint nicht zu funktionieren.

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

Dies gibt die folgende Fehlermeldung zurück:

Schwerwiegender Fehler: Nicht erfasste Ausnahme „Doctrine\ORM\Query\QueryException“ mit Meldung „[Semantical Error] Zeile 0, Spalte 38 in der Nähe von ‘testusername WO’: Fehler: ‘testusername’ ist nicht definiert.’ in …

Ich würde mich über jede Hilfe freuen

Benutzer-Avatar
rojoca

Ich denke, Sie müssen verwenden ->set() Es ist viel sicherer, alle Ihre Werteparameter zu machen:

$queryBuilder = $this->em->createQueryBuilder();
$query = $queryBuilder->update('models\User', 'u')
        ->set('u.username', ':userName')
        ->set('u.email', ':email')
        ->where('u.id = :editId')
        ->setParameter('userName', $userName)
        ->setParameter('email', $email)
        ->setParameter('editId', $editId)
        ->getQuery();
$result = $query->execute();

  • Sie sollten Ihre Variablen immer als Parameter an die Doctrine-Abfrage übergeben!

    – Pi Wi

    9. Januar 2015 um 10:51 Uhr

  • du kannst auch use $qb->update(…)->set('u.username', $qb->createNamedParameter($username)) und lassen Sie den ->setParameter-Teil weg. Das ist IMO der netteste Weg. Eine ähnliche Methode ist -> createPositionalParameter(). Sehen Doktrin-dbal.readthedocs.org/en/latest/reference/…

    – Adrian Föder

    26. Februar 2015 um 9:21 Uhr

  • Es ist nicht einmal “Sie sollten” – Sie müssen verwenden setParameter Andernfalls verwenden Sie get [Syntax Error] line 0, col 80: Error: Expected Literal, got '*' Error.

    – Serhii Popov

    26. Juli um 14:40 Uhr

Benutzer-Avatar
Stphane

Angenommen, es gibt ein Administrator-Dashboard, in dem Benutzer mit ihrer ID als Datenattribut aufgelistet sind, damit sie irgendwann über JavaScript abgerufen werden kann.

Ein Update könnte so durchgeführt werden …

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 Aktionshandhabung:

# 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
}

Arbeitsbeispiel mit Lehre 2.5 (auf Symfony3).

Mit einer kleinen Änderung hat es bei mir gut funktioniert

$qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
               ->update()
               ->field('status')->set($status)
               ->field('id')->equals($instrumentId)
               ->getQuery()
               ->execute();

1352750cookie-checkLehre 2: Aktualisieren Sie die Abfrage mit dem Abfragegenerator

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy