countByDepartmentIds($departmentIds, false); } public function countActiveUsersByDepartmentIds(array $departmentIds): array { return $this->countByDepartmentIds($departmentIds, true); } private function countByDepartmentIds(array $departmentIds, bool $activeOnly): array { $departmentIds = array_values(array_unique(array_map('intval', $departmentIds))); $departmentIds = array_values(array_filter($departmentIds, static fn ($id) => $id > 0)); if (!$departmentIds) { return []; } $placeholders = implode(',', array_fill(0, count($departmentIds), '?')); $joinUsersSql = $activeOnly ? ' join users u on u.id = ud.user_id and u.active = 1' : ''; $rows = DB::select( 'select ud.department_id, count(distinct ud.user_id) as user_count from user_departments ud' . $joinUsersSql . ' where ud.department_id in (' . $placeholders . ') group by ud.department_id', ...array_map('strval', $departmentIds) ); if (!is_array($rows)) { return []; } $result = []; foreach ($rows as $row) { $departmentId = $this->extractIntField($row, 'department_id'); if ($departmentId <= 0) { continue; } $result[$departmentId] = $this->extractIntField($row, 'user_count'); } return $result; } private function extractIntField(array $row, string $field): int { foreach ($row as $value) { if (!is_array($value)) { continue; } if (array_key_exists($field, $value)) { return (int) $value[$field]; } } if (array_key_exists($field, $row)) { return (int) $row[$field]; } return 0; } }