sql >> Databáze >  >> RDS >> Mysql

Přivedení všech uživatelů kromě administrátorů do vztahu mnoho k mnoha

Očekáváme-li, že vztahy jsou správně nastaveny, lze toho dosáhnout poměrně snadno pomocí whereDoesntHave() :

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

Ohledně komentáře:pokud chcete získat všechny uživatele, kteří mají alespoň jednu roli, ale jejich role nemusí obsahovat roli správce, můžete použít tento dotaz:

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

has('roles') zajistí, že EXISTS jedna role pro uživatele, zatímco whereDoesntHave('roles', fn()) zajistí, že se nejedná o roli správce.

Poznámka k navrhované úpravě od @Jino Antony:

Když se zabýváte vztahy many-to-many, všechny whereX($col, $val) metody tvůrce dotazů fungují na jiné tabulce (roles v tomto případě), nikoli kontingenční tabulka (role_user ). Chcete-li zadat dotaz na sloupec v kontingenční tabulce, musíte použít wherePivot('role_id', $roleToExclude) v mém příkladu.



  1. Odešlete aktuální souřadnice GPS do databáze mySQL pomocí rozhraní google maps api

  2. Proč názvy tabulek v SQL Server začínají dbo?

  3. jedna pevná tabulka s více sloupci vs flexibilní abstraktní tabulky

  4. TOP 5 MySQL Delete Syntax s tipy pro vývojáře T-SQL