Moodle получает данные SQL, но не все - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над плагином для отображения всех пользователей, прошедших курсы.

Но я получаю только 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 голосов
/ 30 октября 2018

Как указано в документах , функции $ DB-> get_records _ * () получают хешированный массив записей, проиндексированных по первому возвращенному полю.

Итак, если вы вернете более одной записи с одним и тем же полем user_id, они перезапишут предыдущую запись в массиве.

Убедитесь, что вы включаете отладку при разработке для Moodle, и вы увидите предупреждающие сообщения об этом.

Решения - либо найдите другое поле, которое будет первым возвращенным полем (например, course_completions.id), либо используйте $ DB-> get_recordset_sql (), а затем переберите результаты.

Кроме того, не используйте префикс 'mdl_' в своем коде, так как он сломается на любом сайте с другим префиксом или если вы попытаетесь запустить какие-либо беат или юнит-тесты на своем сайте. Как указано в документации, напишите:

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

(и не используйте AS с таблицами, так как это не совместимо со всеми типами БД)

...