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, то можно так и не узнать, что некоторые роли существуют.

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

  .d8888b.   888    d8P                   .d8888b.  
d88P Y88b 888 d8P d88P Y88b
888 888 d8P 888
888d888b. 888d88K 88888b.d88b. 888d888b.
888P "Y88b 8888888b 888 "888 "88b 888P "Y88b
888 888 888 Y88b 888 888 888 888 888
Y88b d88P 888 Y88b 888 888 888 Y88b d88P
"Y8888P" 888 Y88b 888 888 888 "Y8888P"


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