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