Soy nuevo en el foro y como primer post voy a dejar un ejemplo de cómo trabajar con usuarios, roles y contextos, atacando la base de datos de Moodle mediante querys con las tablas mdl_user, mdl_course, mdl_role, mdl_role_assignments, mdl_context.
Creo que puede ser de gran utilidad a más de uno.
Un cordial saludo.
ACCESO A DATOS DE UN CURSO A TRAVÉS DEL ROL Y DEL CONTEXTO
1. Cuando se agrega un nuevo curso, se agrega información en dos tablas:
§ course: almacena toda la información del curso. El campo id lo distingue del resto.
§ context: guarda información relativa a dónde se encuentra cualquier elemento en Moodle. Los cursos tienen el valor de contextlevel=50, y el campo instandeid se relaciona con el campo id de la tabla course, por tanto si un curso tiene el campo id=8 en la tabla course, los registros de la tabla context que guarden información de ese curso, tendrán el campo instanceid=8.
Con la siguiente query podemos obtener los cursos y su id pero haciendo una join:
SELECT DISTINCT mdl_course.fullname, mdl_context.instanceid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
2. La tabla role_assignments.
Esta tabla guarda información sobré qué contexto tiene asignado cada usuario. El campo contextid se relaciona con el campo id de la tabla context.
Con la siguiente query obtenemos toda la información referente a un curso y su contexto. Esta es la query base que se tendría que utilizar para obtener cualquier información de usuarios, cursos, etc.
SELECT * FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
3. Si por ejemplo ahora queremos obtener qué usuarios están matriculados en un curso, haríamos lo siguiente:
SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
4. Si solo nos interesa obtener los estudiantes hay que hacer otra join con la tabla role:
SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
Para que sólo muestre los estudiantes le añadirmos la claúsula WHERE:
SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
WHERE mdl_role.shortname = 'student'
O su equivalente utilizando el campo id de la tabla role, en vez de utilizar el campo shortname:
SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
WHERE mdl_role.id = 5
5. Si quisieramos obtener el nombre de los alumnos, hay que hacer otra join con la tabla user:
SELECT mdl_course.fullname, mdl_user.username FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid
WHERE mdl_role.id = 5
6. Si deseamos obtener cuántos alumnos tenemos matriculados en cada curso haríamos la siguiente query.
SELECT mdl_course.fullname, count(*) numusuarios FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid
WHERE mdl_role.id = 5
GROUP BY mdl_course.fullname
7. Si quisiéramos obtener la lista de usuarios de un curso en concreto y trabajando con el campo id de un curso, haríamos la siguiente query:
SELECT mdl_user.username, mdl_user.firstname, mdl_user.lastname FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid
WHERE mdl_role.id = 5 AND mdl_course.id = 8
GROUP BY mdl_course.fullname
8. Si quisiéramos trabajar con el nombre del curso, en vez de trabajar con el campo id, trabajaríamos con el campo fullname de la tabla course.
SELECT mdl_user.username, mdl_user.firstname, mdl_user.lastname FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid
WHERE mdl_role.id = 5 AND mdl_course.fullname = 'Curso1'
GROUP BY mdl_course.fullname