En s'attendant à ce que les relations soient correctement configurées, cela peut être réalisé assez facilement avec whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Concernant le commentaire :si vous souhaitez récupérer tous les utilisateurs qui ont au moins un rôle, mais que leurs rôles ne contiennent peut-être pas le rôle d'administrateur, vous pouvez utiliser cette requête :
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
s'assurera qu'il EXISTS
un rôle pour l'utilisateur, tandis que whereDoesntHave('roles', fn())
s'assurera qu'il ne s'agit pas d'un rôle d'administrateur.
Une note sur la modification suggérée de @Jino Antony :
Lorsqu'il s'agit de relations plusieurs-à-plusieurs, tous les whereX($col, $val)
les méthodes du générateur de requêtes fonctionnent sur autre table (roles
dans ce cas), pas le tableau croisé dynamique (role_user
). Pour interroger une colonne du tableau croisé dynamique, vous devez utiliser wherePivot('role_id', $roleToExclude)
dans mon exemple.