Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pozyskiwanie wszystkich użytkowników z wyjątkiem administratorów w relacji wiele-do-wielu

Oczekując, że relacje są ustawione prawidłowo, można to dość łatwo osiągnąć za pomocą whereDoesntHave() :

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

Odnośnie komentarza:jeśli chcesz pobrać wszystkich użytkowników, którzy mają co najmniej jedną rolę, ale ich role mogą nie zawierać roli administratora, możesz użyć tego zapytania:

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

has('roles') zapewni, że EXISTS jedna rola dla użytkownika, podczas gdy whereDoesntHave('roles', fn()) zapewni, że nie jest to rola administratora.

Uwaga na temat sugerowanej edycji @Jino Antony:

Kiedy mamy do czynienia z relacjami wiele-do-wielu, wszystkie whereX($col, $val) metody konstruktora zapytań działają na innej tabeli (roles w tym przypadku), a nie tabela przestawna (role_user ). Aby wykonać zapytanie o kolumnę w tabeli przestawnej, musisz użyć wherePivot('role_id', $roleToExclude) w moim przykładzie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połączenie MySQL przez tunel SSH

  2. BŁĄD 1698 (28000):Odmowa dostępu dla użytkownika „root”@„localhost”

  3. Wordpress aktualizuje tabelę mysql

  4. PHP:wiele zapytań SQL w jednej instrukcji mysql_query

  5. Jak zatrzymać/uruchomić MySQL za pomocą MySQL Workbench