2010-12-02 12 views
52

Hola Tengo la siguiente consulta, pero parece que no funciona.Doctrina 2: consulta de actualización con generador de consultas

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

Esto devuelve el siguiente mensaje de error:

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

Me alegraría de cualquier ayuda

Respuesta

110

creo que es necesario utilizar Expr con ->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(); 

De cualquier eso o haga todos sus parámetros de valores:

$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

¡Siempre debe pasar sus variables como parámetro a la consulta de Doctrine! –

+0

¿También puede proporcionar un ejemplo para las actualizaciones de uno a muchos? –

+4

también puede '' usar $ qb-> update (...) -> set ('u.nombre de usuario', $ qb-> createNamedParameter ($ username)) '' y omitir la parte -> setParameter. Esa es la OMI de la mejor manera. Un método similar es '' -> createPositionalParameter() ''. Ver http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#binding-parameters-to-placeholders –

5

Digamos que usted tiene un poco de back-end que muestra una lista de usuarios (accesible por unos administradores que podría haber acceso de lectura/escritura de los usuarios detalles).
Allí puede imprimir el id de los usuarios en su propia fila como un atributo de datos para recuperarlo de Javascript mientras se desencadena algún evento.

A continuación, una actualización puede ser ejecutado de esta manera ...

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

Y dentro de la acción de manejo (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 
    } 
    # … 

ejemplo usando Doctrina 2,5 de trabajo (en la parte superior de Symfony3).

Cuestiones relacionadas