web-dev-qa-db-fra.com

Doctrine 2: Mettre à jour la requête avec le générateur de requête

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 capturée 'Doctrine\ORM\QueryException' avec le message '[Erreur sémantique], ligne 0, col 38 près de' nom_test test WHERE ': Erreur:' nom_test 'n'est pas défini.' dans ...

Je serais heureux de toute aide

67
CarlM

Je pense que vous devez utiliser Expr avec ->set() (Cependant CEC IS PAS SÛR et vous ne devriez pas le faire):

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

Il est beaucoup plus sûr de définir tous vos paramètres de valeurs à la place:

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

Supposons qu'il existe un tableau de bord administrateur dans lequel les utilisateurs sont répertoriés avec leur identifiant imprimé en tant qu'attribut de données, de sorte 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 traitement de l'action:

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

6
Stphane