Bonjour,

J'essaie de convertir une requête SQL dans Symfony pour calculer une position de classement en fonction des points d'un utilisateur.

La requête c'est celle-ci, elle fonctionne dans phpMyAdmin :

SELECT 1 + COUNT(*) AS rank FROM fc_user WHERE points > (SELECT points FROM fc_user WHERE user_id=2)

J'ai essayé ça :

$subquery = $this->createQueryBuilder('f')
            ->select('f.points')
            ->andWhere('f.user > :user')
            ->setParameter('user', $user)
            ->getQuery()
            ->getResult()
        ;

         return $this->createQueryBuilder('f')
            ->select('1 + count(*) AS rank')
            ->andWhere('f.points > :subquery')
            ->setParameter('subquery', $subquery)
            ->getQuery()
            ->getOneOrNullResult()
        ;

Mais je me hurte à une erreur Expected Literal, got '*', je ne pense pas que ce soit la bonne méthode.

Auriez-vous une idée de comment l'écrire en Query Builder ?

Merci !

2 réponses


chead241
Auteur
Réponse acceptée

Merci, au final j'ai trouvé. Ma requête fonctionnait sauf qu'à la place de count(*) il fallait mettre count(f.points).

Ca reste une supposition :
Met un autre alias à ta subquerry et retire le getQuery()->getResult()

subquery = $this->createQueryBuilder('s')
            ->select('s.points')
            ->andWhere('s.user > :user')
            ->setParameter('user', $user)
        ;

         return $this->createQueryBuilder('f')
            ->select('1 + count(*) AS rank')
            ->andWhere('f.points > :subquery')
            ->setParameter('subquery', $subquery)
            ->getQuery()
            ->getOneOrNullResult()
        ;