sql >> Database >  >> RDS >> Mysql

Alle gebruikers behalve beheerders in een veel-op-veel-relatie krijgen

In de verwachting dat de relaties goed zijn ingesteld, kan dit vrij eenvoudig worden bereikt met whereDoesntHave() :

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

Wat betreft de opmerking:als u alle gebruikers wilt ophalen die ten minste één rol hebben, maar hun rollen mogen niet de beheerdersrol bevatten, dan kunt u deze query gebruiken:

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

has('roles') zal ervoor zorgen dat er EXISTS één rol voor de gebruiker, terwijl whereDoesntHave('roles', fn()) zal ervoor zorgen dat het geen beheerdersrol is.

Een opmerking over de voorgestelde bewerking van @Jino Antony:

Als het om veel-op-veel-relaties gaat, moeten alle whereX($col, $val) methoden van de querybuilder werken op de andere tabel (roles in dit geval), niet de draaitabel (role_user ). Om een ​​kolom in de draaitabel te doorzoeken, moet u wherePivot('role_id', $roleToExclude) gebruiken in mijn voorbeeld.



  1. Een goede referentie voor Oracle PL/SQL

  2. Een gegevensbestand toevoegen aan een SQL Server-database (T-SQL)

  3. Samengestelde primaire sleutel maken in MySQL

  4. Homebrew, MySQL 8-ondersteuning