93 votes

Doctrine 2 : Mise à jour de la requête avec le constructeur de requêtes

Bonjour J'ai la requête suivante mais elle ne semble pas fonctionner.

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

Cela renvoie le message d'erreur suivant :

Erreur fatale : Exception non attrapée Doctrine \ORM\Query\QueryException ' avec le message 0, col 38 near 'testusername WHERE' : Error : 'testusername' n'est pas défini'. dans ...

Je serais heureux de toute aide

176voto

rojoca Points 5454

Je pense que vous devez utiliser ->set() Il est beaucoup plus sûr de paramétrer toutes vos valeurs :

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

13voto

f00bar Points 1551

Supposons qu'il existe un tableau de bord d'administrateur où les utilisateurs sont répertoriés avec leur identifiant imprimé comme attribut de données afin qu'il puisse être récupéré à un moment donné via JavaScript.

Une mise à jour pourrait être exécutée de cette façon

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 le traitement des actions :

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

Exemple de travail utilisant Doctrine 2.5 (au dessus de Symfony3) .

4voto

Abhi Das Points 325

Avec un petit changement, cela a bien fonctionné pour moi.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X