sql >> Database teknologi >  >> RDS >> Mysql

Får alle brugere undtagen administratorer i mange-til-mange forhold

Forventer man, at relationerne er konfigureret korrekt, kan dette opnås ret nemt med whereDoesntHave() :

$roleToExclude = 1;
$users = User::query()
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

Angående kommentaren:hvis du ønsker at hente alle brugere, der har mindst én rolle, men deres roller måske ikke indeholder admin-rollen, så kan du bruge denne forespørgsel:

$roleToExclude = 1;
$users = User::query()
    ->has('roles')
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

has('roles') vil sikre, at der EXISTS én rolle for brugeren, mens whereDoesntHave('roles', fn()) vil sikre, at det ikke er en administratorrolle.

En note om den foreslåede redigering af @Jino Antony:

Når du har at gøre med mange-til-mange-relationer, er alle whereX($col, $val) metoderne i forespørgselsbyggeren fungerer på anden tabel (roles i dette tilfælde), ikke pivottabellen (role_user ). For at forespørge på en kolonne i pivottabellen skal du bruge wherePivot('role_id', $roleToExclude) i mit eksempel.



  1. Hvordan kører man kun Djangos testdatabase i hukommelsen?

  2. Resultater inden for radius - Optimering af langsom MySQL-forespørgsel

  3. Hvad er forskellen mellem pls_integer og binary_integer?

  4. En introduktion til Concurrent Collection API'er i Java