Moodle 获取 SQL 数据但未获取全部

Moodle get SQL data but don't get all

我正在开发一个插件,用于显示所有用户已完成的课程。

但我只得到 10 条记录,当我将 SQL 放入我的数据库时,我得到 40+。我认为这是有限制的,或者每个用户只能 return 1 门课程。

有什么建议吗?

externallib.php 文件:

/**
 * External Web Service Template
 *
 * @package    specialist_in_websites
 * @copyright  2011 Moodle Pty Ltd (http://moodle.com)
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
require_once($CFG->libdir . "/externallib.php");

class specialist_in_websites_users_courses_external extends external_api
{

    /**
     * Returns description of method parameters
     * @return external_function_parameters
     */
    public static function hello_world_parameters()
    {
        return new external_function_parameters(
                array()
        );
    }

    /**
     * Returns welcome message
     * @return string welcome message
     */
    public static function hello_world()
    {
        global $DB;

        $sql = 'SELECT u.id as user_id, c.id as course_id, DATE_FORMAT(FROM_UNIXTIME(p.timecompleted),"%Y-%m-%d") AS completed_time 
        FROM mdl_course_completions AS p
        JOIN mdl_course AS c ON p.course = c.id
        JOIN mdl_user AS u ON p.userid = u.id
        WHERE c.enablecompletion = 1 ORDER BY u.id';

        $datas = $DB->get_records_sql($sql);

        return (array)$datas;
    }

    /**
     * Returns description of method result value
     * @return external_description
     */
    public static function hello_world_returns()
    {
        return new external_multiple_structure(
            new external_single_structure(
                array(
                    'user_id' => new external_value(PARAM_INT, 'user id'),
                    'course_id' => new external_value(PARAM_INT, 'course id'),
                    'completed_time' => new external_value(PARAM_TEXT, 'Time of Completed'),
                )
            )
        );
    }
}

和响应代码:

string(510) "[{"user_id":2,"course_id":12,"completed_time":null},{"user_id":3,"course_id":10,"completed_time":null},{"user_id":4,"course_id":9,"completed_time":null},{"user_id":5,"course_id":41,"completed_time":null},{"user_id":6,"course_id":14,"completed_time":null},{"user_id":7,"course_id":10,"completed_time":null},{"user_id":8,"course_id":9,"completed_time":null},{"user_id":9,"course_id":9,"completed_time":null},{"user_id":10,"course_id":10,"completed_time":null},{"user_id":11,"course_id":10,"completed_time":null}]"

docs 中所述,$DB->get_records_*() 函数获取记录的散列数组,由第一个字段索引 returned.

因此,如果您 return 多条记录具有相同的 user_id 字段,那么它们将覆盖数组中的前一条记录。

确保在为 Moodle 开发时打开 debugging,您将看到有关此的警告消息。

解决方案 - 找到一个不同的字段作为第一个字段 returned(例如 course_completions.id)或使用 $DB->get_recordset_sql() 然后循环遍历结果.

此外,不要在您的代码中使用 'mdl_' 前缀,因为这会在任何具有不同前缀的站点上中断,或者如果您尝试 运行 对您的网站进行任何 behat 或单元测试地点。如文档中所述,写:

FROM {course_completions} p
JOIN {course} c ON p.course = c.id
etc.

(并且不要对表使用 AS,因为它与所有数据库类型不兼容)