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