'integer', 'student_id' => 'integer', 'class_section_id'=> 'integer', 'report_date' => 'date', ]; /* Optional relationships */ public function parent() { return $this->belongsTo(User::class, 'parent_id'); } public function student() { return $this->belongsTo(Student::class, 'student_id'); } public function classSection() { // classSection table uses class_section_id as “business key”; your join uses that. return $this->belongsTo(ClassSection::class, 'class_section_id', 'class_section_id'); } /** * Laravel equivalent of CI listForDateRange() * Returns array rows with: * parent_attendance_reports.* + students firstname/lastname + classSection class_section_name */ public static function listForDateRange( ?string $startDate = null, ?string $endDate = null, ?string $schoolYear = null, ?string $semester = null ): array { $q = DB::table('parent_attendance_reports as par'); if (!empty($startDate)) { $q->where('par.report_date', '>=', $startDate); } if (!empty($endDate)) { $q->where('par.report_date', '<=', $endDate); } if (is_string($schoolYear) && $schoolYear !== '') { $q->where('par.school_year', $schoolYear); } if (is_string($semester) && $semester !== '') { $q->where('par.semester', $semester); } $q->leftJoin('students as s', 's.id', '=', 'par.student_id') ->leftJoin('classSection as cs', 'cs.class_section_id', '=', 'par.class_section_id') ->select('par.*', 's.firstname', 's.lastname', 'cs.class_section_name') ->orderBy('par.report_date', 'asc') ->orderBy('par.class_section_id', 'asc') ->orderBy('par.student_id', 'asc'); return $q->get()->map(fn ($r) => (array) $r)->all(); } }