Je veux récupérer les Users selon leurs rôles
Dans mon entité User

#[ORM\Column(type: 'json')]
private $roles = [];

Voici ce que j'ai fais dans mon controller qui ne marche pas

$users = $this->userRepository->findBy(
    ['roles' => 'ROLE_USER'],
    ['id' => 'DESC']
 );

Puis j'ai tenté ma chance dans le repository

public function findAllUser(?array $roles)
{
    if (!$roles) {
        $query = $this->createQueryBuilder('u')
            ->orderBy('u.firstName', 'ASC')
        ;
        return $query->getQuery()->getResult();
    } else {
        $query = $this->createQueryBuilder('u')
            ->andWhere('u.roles = :val')
            ->setParameter('val', $roles)
            ->orderBy('u.firstName', 'ASC')
        ;
        return $query->getQuery()->getResult();
    }
}

Chance je récupère tout les Users avec :

$users = $this->userRepository->findAllUser([]);

Malchance je ne recupere pas un User d'un role precis :

$users = $this->userRepository->findAllUser(['ROLE_ADMIN']);

Ce que je veux

Je souhaite récupérer les Users selon leurs rôles

2 réponses


gillesr
Réponse acceptée

Si tu veux récupérer les utilisateurs ayant un role précis, tu peux essayer ça :


public function findUsers(?string $role)
{
    $query = $this->createQueryBuilder('u')
                    ->orderBy('u.firstName', 'ASC')
    if ($roles) {
            $query->andWhere('u.roles LIKE :val')
                        ->setParameter('val', '%'.$role.'%');
    }
        return $query->getQuery()->getResult();
}

Et l'appel de la méthode :


$users = $this->userRepository->findUsers('ROLE_ADMIN');

Note que j'ai remplacé le tableau par un string pour sélectionner sur un rôle, mais ça peut s'adapter si tu veux en spécifier plusieurs.

Yassin237
Auteur
Réponse acceptée

merci @gillesr

Voila ce que j'ai fais qui marche avant de voir ta reponse:

Dans mon UserRepository

public function findAllUser(?string $roles)
    {
        if (!$roles) {
            $query = $this->createQueryBuilder('u')
                ->orderBy('u.firstName', 'ASC')
            ;
            return $query->getQuery()->getResult();
        }else {
            $query = $this->createQueryBuilder('u')
                ->where('u.roles LIKE :val')
                ->setParameter('val', $roles)
                ->orderBy('u.firstName', 'ASC')
            ;
            return $query->getQuery()->getResult();
        }
    }

Et dans le controller :

pour récupérer tout Users :

$users = $this->userRepository->findAllUser('');

pour récupérer les Users avec rôle [] en base qui est ROLE_USER dans mon cas

$users = $this->userRepository->findAllUser('[]');

pour récupérer les Users avec rôle ["ROLE_ADMIN"] en base qui est ROLE_ADMIN dans mon cas

$users = $this->userRepository->findAllUser('["ROLE_ADMIN"]');

Ce qui n'est pas loin de ce que tu me propose.
Cette facon de faire est aussi correcte? dis-moi