[Symfony6]Récupérer les users selon leurs rôles

Par Yassin237, il y a 4 ans


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, il y a 4 ans

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, il y a 4 ans

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