'required', 'member_rank_id' => 'required', 'start' => 'required', 'status' => 'required', ]; public $belongsTo = [ 'member_rank' => 'GermanAirlinesVa\Schooling\Models\MemberRank', 'member' => 'GermanAirlinesVa\Social\Models\Member', ]; public $belongsToMany = [ 'exam_questions' => [ 'GermanAirlinesVa\Schooling\Models\ExamMemberRankQuestion', 'table' => 'exam_exam_answer_exam_question', 'key' => 'exam_id', 'otherKey' => 'exam_question_id', ], 'exam_answers' => [ 'GermanAirlinesVa\Schooling\Models\ExamMemberRankAnswer', 'table' => 'exam_exam_answer_exam_question', 'key' => 'exam_id', 'otherKey' => 'exam_answer_id', ], ]; /** * The "booting" method of the model. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope('exam_member_rank_member_rank_id', function ($builder) { $builder->where('member_rank_id', '<>', null); }); } public function grade() { $this->load([ 'exam_questions' => function ($query) { $query->groupBy('id'); }, ]); $returnVal = []; $returnGrade = 0; foreach ($this->exam_questions as $question) { $answers = $question->exam_answers; $returnAnswers = []; $returnAnswerGrade = true; foreach ($answers as $answer) { $given = $this->exam_answers->contains($answer->id); array_push($returnAnswers, [ 'answer' => $answer, 'status' => $given, 'grade' => $given == $answer->is_correct, ]); $returnAnswerGrade = $returnAnswerGrade && $given == $answer->is_correct; } array_push($returnVal, [ 'question' => $question, 'answers' => $returnAnswers, 'grade' => $returnAnswerGrade, ]); $returnGrade = $returnAnswerGrade ? $returnGrade + 1 : $returnGrade; } return ['exam' => $returnVal, 'grade' => $returnGrade]; } }