Database API: получить список ролей с количеством пользователей

Потребовалось мне в задаче получить одним запросом из БД список всех ролей и количество пользователей, относящихся к каждой роли. Не сказать, что задач сложная, однако определенное время я на составление этого запроса потратил.

Список ролей и количество пользователей

Получилось у меня следующее (Drupal Database API):

  1. $query = db_select('role', 'r');
  2. $query->leftJoin('users_roles', 'ur', 'ur.rid = r.rid');
  3. $query->addExpression('COUNT(ur.rid)', 'user_count');
  4. $query->fields('r', array('rid', 'name'));
  5. $query->groupBy('r.rid');
  6.  
  7. $result = $query->execute();
  8. $roles = array();
  9.  
  10. while ($record = $result->fetchAssoc()) {
  11. $key = $record['name'];
  12. $roles[$key] = $record['user_count'];
  13. }

Самым тонким моментом оказалось использование ('COUNT(ur.rid)' вместо привычного ('COUNT(*)'. Разница в том, что для второго случая роли, у которых нет пользователей, также получат количество "1". А если поменять leftJoin на innerJoin, то можно так и не узнать, что некоторые роли существуют.

Добавить комментарий

  .d88888b.   888b     d888  888       888  888      
d88P" "Y88b 8888b d8888 888 o 888 888
888 888 88888b.d88888 888 d8b 888 888
888 888 888Y88888P888 888 d888b 888 88888b.
888 888 888 Y888P 888 888d88888b888 888 "88b
888 Y8b 888 888 Y8P 888 88888P Y88888 888 888
Y88b.Y8b88P 888 " 888 8888P Y8888 888 d88P
"Y888888" 888 888 888P Y888 88888P"
Y8b

Зарегистрируйтесь для добавления материалов без проверки.