You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle中基于课程组和角色获取用户的最优方案咨询

更贴合需求的实现方案

你说得对,course_enrolment_manager的核心定位是课程 enrolment 管理的UI逻辑支撑(比如处理 enrol 用户、批量角色分配、界面渲染这类交互场景),用它来单纯获取用户列表确实偏离了它的设计初衷,有点“杀鸡用牛刀”的感觉。

针对你的需求——不写SQL、获取指定课程+分组+角色的用户列表,Moodle核心提供了更合适的API:get_enrolled_users(),这是专门为这类数据查询场景设计的工具函数,完全符合你的要求。

优化后的代码实现

function get_users_by_group_and_role($course, $groupid, $roleid) {
    // 兼容传入课程对象或课程ID的情况
    $courseid = is_object($course) ? $course->id : $course;
    
    // 获取课程上下文(Moodle权限系统的核心依赖)
    $context = context_course::instance($courseid);
    
    // 调用核心API获取符合条件的用户,仅返回ID字段
    $enrolled_users = get_enrolled_users(
        $context,
        $roleid,
        $groupid,
        'u.id'
    );
    
    // 提取ID数组,和原函数的返回格式保持一致
    return array_column($enrolled_users, 'id');
}

为什么这个方案更合适?

  • 贴合场景设计:get_enrolled_users()是Moodle官方推荐的课程用户查询API,专门用于提取已注册课程的用户数据,从设计目的上完全匹配你的需求。
  • 无需维护SQL:函数内部已经封装了所有复杂的关联查询(用户表、角色分配表、分组关联表、enrol状态表等),你只需要传入过滤参数即可。
  • 灵活可扩展:如果后续需要调整返回字段(比如同时获取用户名、邮箱),只需要修改第四个参数(比如改成'u.id, u.username, u.email');还可以通过额外参数控制是否包含非活跃用户、是否排除特定角色等。

内容的提问来源于stack exchange,提问作者Nghi Ho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:29