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

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

           8888888888                     
d88P
d88P
88888888 d88P .d8888b .d8888b
d88P 88888888 88K 88K
d88P d88P "Y8888b. "Y8888b.
d88P d88P X88 X88
88888888 d88P 88888P' 88888P'


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