为什么我的 Moodle 查询在 "Ad hoc database queries" 中有效,但在我的插件中却无效?

Why does my Moodle query work in "Ad hoc database queries" but not in my plugin?

我有以下查询来检索自定义 Moodle 插件中的学术顾问。

学术顾问角色配置如下:https://docs.moodle.org/en/Parent_role

我在临时数据库查询(以及MySQL Workbench)中有运行它,并且它在这两个方面都运行良好那些,但由于某些奇怪的原因,它在我的插件中不起作用。

db_update.php中:

function get_academic_advisees($userid) {
    global $DB;

    $sql = 'SELECT child.username, child.firstname, child.lastname
            FROM {user} user
            JOIN {role_assignments} ra ON ra.userid = user.id
            JOIN {role} role ON role.id = ra.roleid
            JOIN {context} ctx ON ctx.id = ra.contextid 
            AND ctx.contextlevel = 30
            JOIN {user} child ON child.id = ctx.instanceid
            WHERE role.shortname = "academic_adviser"
            and user.username = ?';

    return $DB->get_records_sql($sql, array($userid));
}

在我的 attendance_form.php 页面中,它包含在 attendance.php 中(调用 db_update.php):

require_once("{$CFG->libdir}/formslib.php");

class attendance_form extends moodleform {

    function definition() {
        $mform =& $this->_form;

        $mform->addElement('html', '<h2>' . get_string('attendance', 'local_attendance')  . '</h2>');
        $mform->addElement('html', '<p>This report allows you to retrieve attendance data for your academic advisees.</p>');

        //$mform->addElement('text', 'student_number', get_string('student_number', 'local_attendance'));
        global $USER;
        $userid = $USER->id;
        $myAdvisees = array();
        $adviseeArray = array();
        $myAdvisees = get_academic_advisees($userid);
        foreach($myAdvisees as $myAdvisee) {
            $key = $myAdvisee->username;
            $value = $myAdvisee->firstname . $myAdvisee->lastname . '(' . $myAdvisee->username . ')';
            $adviseeArray[$key] = $value;
        }

        $mform->addElement('select', 'student_number', get_string('student_number', 'local_attendance'), $adviseeArray);

        $this->add_action_buttons(true, get_string('save', 'local_attendance'));
    }
}

该函数采用参数 'userid',但在查询中它试图将此匹配到 'user.username'。

因此,您需要输入:

$userid = $USER->username;

如果你想让它在你的表单中工作。

此外,请从 $mform =& $this->_form 中删除 & - Moodle 很久以前就停止支持 PHP 4!

所以正确的代码是(感谢@davosmith):

function get_academic_advisees($userid) {
    global $DB;

    $sql = 'SELECT child.username, child.firstname, child.lastname
            FROM {user} user
            JOIN {role_assignments} ra ON ra.userid = user.id
            JOIN {role} role ON role.id = ra.roleid
            JOIN {context} ctx ON ctx.id = ra.contextid 
            AND ctx.contextlevel = 30
            JOIN {user} child ON child.id = ctx.instanceid
            WHERE role.shortname = "academic_adviser"
            and user.id = ?';

    return $DB->get_records_sql($sql, array($userid));
}