Moodle获取SQL数据,但不能全部获取

时间:2018-10-30 19:29:58

标签: sql database moodle moodle-api

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

但是我只得到10条记录,当我将SQL放在数据库中时,我得到40条记录。我认为有一个限制,或者它只会从每个用户那里返回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}]"

1 个答案:

答案 0 :(得分:0)

docs中所述,$ DB-> get_records _ *()函数将获取记录的哈希数组,该数组由返回的第一个字段索引。

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

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

解决方案-找到另一个字段作为返回的第一个字段(例如course_completions.id),或者使用$ DB-> get_recordset_sql(),然后遍历结果。

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

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

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