Mysql
 sql >> база данни >  >> RDS >> Mysql

Получаване на всички потребители с изключение на администраторите във връзка много към много

Очаквайки, че връзките са настроени правилно, това може да се постигне доста лесно с whereDoesntHave() :

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

Относно коментара:ако искате да извлечете всички потребители, които имат поне една роля, но ролите им може да не съдържат ролята на администратор, тогава можете да използвате тази заявка:

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

has('roles') ще гарантира, че EXISTS една роля за потребителя, докато whereDoesntHave('roles', fn()) ще гарантира, че не е администраторска роля.

Бележка за предложената редакция на @Jino Antony:

Когато работите с релации много към много, всички whereX($col, $val) методите на конструктора на заявки работят върху другата таблица (roles в този случай), а не основната таблица (role_user ). За да направите заявка за колона в обобщената таблица, ще трябва да използвате wherePivot('role_id', $roleToExclude) в моя пример.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задаване на паролата за root на MySQL на OS X

  2. mysql:изберете, вмъкнете, изтрийте и актуализирайте в една заявка

  3. Мога ли да използвам подзаявка в израз INSERT?

  4. Как мога да получа брой клиенти на ден по уникален и повтарящ се клиент за конкретна дата?

  5. Достатъчен ли е Markdown (с strip_tags) за спиране на XSS атаки?