'integer', 'school_id' => 'integer', 'class_section_id' => 'integer', 'updated_by' => 'integer', 'homework_index' => 'integer', // keep numeric; change to 'integer' if your scores are whole numbers 'score' => 'decimal:2', 'max_points' => 'decimal:2', 'locked_by' => 'integer', 'locked_at' => 'datetime', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; /* Optional relationships */ public function student() { return $this->belongsTo(Student::class, 'student_id'); } public function classSection() { return $this->belongsTo(ClassSection::class, 'class_section_id'); } /** * Laravel equivalent of legacy getAverageHomeworkScore() * Computes average based only on non-blank numeric scores. */ public static function getAverageHomeworkScore( int $studentId, string $semester, string $schoolYear, ?int $classSectionId = null ): ?float { $q = DB::table('homework') ->select('score') ->where('student_id', $studentId) ->where('semester', $semester) ->where('school_year', $schoolYear); if ($classSectionId !== null) { $q->where('class_section_id', $classSectionId); } $rows = $q->get(); if ($rows->isEmpty()) { return null; } $total = 0.0; $count = 0; foreach ($rows as $r) { $score = $r->score ?? null; if ($score === null) { continue; } if (is_string($score) && trim($score) === '') { continue; } if ($score === '') { continue; } if (! is_numeric($score)) { continue; } $total += (float) $score; $count++; } if ($count === 0) { return null; } return round($total / $count, 2); } }