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,因为它与所有数据库类型不兼容)
我正在开发一个插件,用于显示所有用户已完成的课程。
但我只得到 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,因为它与所有数据库类型不兼容)