student_id-FK-Migration Stufe 1+2: Name-Joins -> student_sessions.student_id

- student_sessions: neue Spalte student_id (+Index), backfilled aus (class_id,display_name)
- Session::createStudent setzt student_id (per Lookup, falls nicht uebergeben)
- alle Joins students<->student_sessions von display_name auf student_id umgestellt:
  Benchmark.php, live.php (5x), results.php (4x + runs), modules.php, profile.php, progress.php (answers+runs)
- verlustfrei verifiziert (alt-Join == neu-Join, class 99/102)

Robuster gegen Umbenennung/Doppelnamen, indexierbare Joins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 19:16:41 +02:00
parent 2984d93e7e
commit fb44ec7afe
7 changed files with 42 additions and 30 deletions
+10 -6
View File
@@ -16,21 +16,25 @@ if ($method === 'GET') {
// ─── Sub-View: eigene Reflexionen einer Schüler:in ──────────────────
if (($_GET['view'] ?? '') === 'reflections') {
if (!$studentSessionId) Response::error('Nur eingeloggte Schüler:innen', 401);
$session = $db->fetchOne('SELECT class_id, display_name FROM student_sessions WHERE id = ?', [$studentSessionId]);
$session = $db->fetchOne('SELECT class_id, display_name, student_id FROM student_sessions WHERE id = ?', [$studentSessionId]);
if (!$session) Response::error('Session nicht gefunden', 404);
// Reflexionen über alle assessments dieser Schüler:in (matched über
// class_id + display_name, weil verschiedene Sessions denselben
// Bearbeiter:innen-Namen tragen können).
// student_id (FK) statt fragilem display_name-Join; Fallback für seltene Alt-Sessions ohne FK.
$sid = $session['student_id'] ?? null;
if (!$sid) {
$st = $db->fetchOne('SELECT id FROM students WHERE class_id = ? AND display_name = ?', [$session['class_id'], $session['display_name']]);
$sid = $st ? (int)$st['id'] : 0;
}
// Reflexionen über alle Sessions dieser Schüler:in (per student_id verknüpft).
$rows = $db->fetchAll(
"SELECT a.sim_id, a.submitted_at, a.reflections
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
WHERE ss.class_id = ? AND ss.display_name = ?
WHERE ss.student_id = ?
AND a.reflections IS NOT NULL
AND JSON_LENGTH(a.reflections) > 0
ORDER BY a.submitted_at DESC
LIMIT 50",
[$session['class_id'], $session['display_name']]
[$sid]
);
$items = [];
foreach ($rows as $r) {