2010-12-02 8 views
52

Hallo Ich habe die folgende Abfrage, aber es scheint nicht zu funktionieren.Doktrin 2: Update-Abfrage mit Abfrage-Generator

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

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

Entweder:

Fatal error: Uncaught exception 'Doctrine\ORM\Query\QueryException' with message '[Semantical Error] line 0, col 38 near 'testusername WHERE': Error: 'testusername' is not defined.' in ...

ich keine Hilfe

Antwort

110

Ich glaube, Sie Expr mit ->set() verwenden müssen froh sein würde, dass oder alle Ihre Werte Parameter:

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

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

+0

Können Sie auch ein Beispiel für die One-to-Many-Updates geben? –

+4

Sie können auch '' $ qb-> update (...) verwenden -> set ('u.username', $ qb-> createNamedParameter ($ username)) '' und den Parameter -> setParameter auslassen. Das ist IMO der schönste Weg. Eine ähnliche Methode ist '' -> createPositionalParameter() ''. Siehe http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#binding-parameters-to-placeholders –

5

Angenommen, Sie haben einige Backend haben eine Liste von Benutzern (erreichbar mit einigen Admins, die Lese-/Schreibzugriff haben könnte auf Benutzer Details) zeigt.
Dort können Sie Benutzer ID in einer eigenen Zeile als Datenattribut drucken, um es aus Javascript abrufen, während ein Ereignis ausgelöst wird.

Dann kann ein Update auf diese Weise ausgefü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(); 
    } 

Und in der (Ajax) Handhabung Aktion ...

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

Arbeitsbeispiel mit Lehre 2.5 (oben Symfony3).

Verwandte Themen