sql >> Databasteknik >  >> RDS >> Mysql

Få alla användare utom administratörer i många-till-många-relationer

Om man förväntar sig att relationerna är korrekt inställda kan detta uppnås ganska enkelt med whereDoesntHave() :

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

Angående kommentaren:om du vill hämta alla användare som har minst en roll, men deras roller kanske inte innehåller administratörsrollen, kan du använda den här frågan:

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

has('roles') kommer att se till att det EXISTS en roll för användaren, medan whereDoesntHave('roles', fn()) kommer att se till att det inte är en administratörsroll.

En anteckning om den föreslagna redigeringen av @Jino Antony:

När du har att göra med många-till-många-relationer, alla whereX($col, $val) metoderna för frågebyggaren fungerar på den andra tabellen (roles i det här fallet), inte pivottabellen (role_user ). För att fråga en kolumn i pivottabellen måste du använda wherePivot('role_id', $roleToExclude) i mitt exempel.



  1. MySQL – Få senaste frågekostnad genom att använda VISA STATUS SOM "Last_Query_Cost"

  2. Hur man filtrerar datum med datetimepicker via databas

  3. Hur man designar en mysql-databas med flera hyresgäster

  4. Hur gör man Qt mysql-drivrutin i Windows?