Re bonjour Laurent.
J'ai bien regardé le
message privé que tu m'as fait suivre avec effectivement le soucis que tu mentionnes, où la
catégorie indiquée n'a rien à voir avec ce que tu attends.
En fait je n'avais pas assez regardé la
requête, elle comporte un manque.
La jointure
mdl_context -
mdl_role_assignments est une jointure qui doit être conditionnelle. Le champs
instanceid n'est pas le seul à prendre en
compte dans la jointure. En effet, la table des contextes contient tous les contextes et tous ne sont pas des catégories. Il y a aussi des contextes qui correspondent à des cours, au système, à des utilisateurs, des
blocs, etc. Donc pour faire la bonne jointure il faut aussi
intégrer le type de contexte concerné (ce que Moodle appelle le niveau de contexte).
Dans l'exemple que tu m'as fait suivre, l'id 14 n'est peut être pas un id de catégorie. Le lien retourné par la requête, lui, fonctionne car il cible un contexte.
Dans ton exemple, le contexte qui confère à ton utilisateur son rôle, référence un élément qui a l'id 14, mais il faut déterminer dans quel table aller chercher cet id. Cette information se déduit de la valeur du champs contextelevel.
En fouillant précédemment dans le code j'ai pu établir cette liste (c'est probablement documenté officiellement, mais je ne sais pas où) :
Donc pour avoir quelque chose de plus complet et plus juste, il faudrait par exemple ceci (à noter : les nouvelles colonnes dans le SELECT, les LEFT JOIN, Les conditions de jointure sur contextlevel) :
SELECT DISTINCT c.instanceid AS ID,
t1.name AS categorie,
t2.shortname AS course,
t3.id AS moduleid,
if(c.contextlevel = 10, 'oui', 'non') as contextesysteme,
u.lastname AS NOM,
u.firstname AS PRENOM,
concat('https://url_de_le_plateforme/admin/roles/assign.php?contextid=', c.id) as attribution_role_link
FROM `mdl_user` AS u
JOIN `mdl_role_assignments` AS ra ON ra.userid = u.id
JOIN `mdl_context` AS c ON c.id = ra.contextid
left JOIN `mdl_course_categories` AS t1
ON t1.id = c.instanceid
and c.contextlevel = 40 -- contexte catégorie
left JOIN `mdl_course` AS t2
ON t2.id = c.instanceid
and c.contextlevel = 50 -- contexte cours
left JOIN `mdl_course_modules` AS t3
ON t3.id = c.instanceid
and c.contextlevel = 70 -- contexte module
WHERE `roleid`=1
ORDER BY c.instanceid;
il est donc possible de faire ces jointures en complexifiant les conditions de jointure (ce qui suit 'ON') pour systématiquement préciser pour quel niveau (type) de contexte la jointure est valide.
Il peut être aussi intéressant, comme je l'ai fait ci-dessus, d'utiliser des 'LEFT JOIN' pour sortir toutes les lignes, qu'une correspondance ait été trouvée ou non avec la table liée. En l'absence de correspondance c'est 'null' qui est retourné. Ainsi la requête ci-dessus ne mettra à jour qu'un seul des 4 champs (categorie, course, moduleid, contextesysteme), les autres seront à 'null', en fonction de la valeur du contextlevel. (pour contextesysteme ce sera le résultat du if plutôt).