Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir tous les utilisateurs sauf les administrateurs dans une relation plusieurs à plusieurs

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.