'required', 'typerating_id' => 'required', ]; public $belongsTo = [ 'typerating' => 'GermanAirlinesVa\Schooling\Models\Typerating', 'member' => 'GermanAirlinesVa\Social\Models\Member', ]; public $belongsToMany = [ 'exam_questions' => [ 'GermanAirlinesVa\Schooling\Models\ExamTyperatingQuestion', 'table' => 'exam_exam_answer_exam_question', 'key' => 'exam_id', 'otherKey' => 'exam_question_id', ], 'exam_answers' => [ 'GermanAirlinesVa\Schooling\Models\ExamTyperatingAnswer', '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_typerating_typerating_id', function ($builder) { $builder->where('typerating_id', '<>', null); }); } public static function createNew($member_id, $typerating_id) { $exam = new ExamTyperating(); $exam->member_id = $member_id; $exam->typerating_id = $typerating_id; $entry = []; $questions = ExamTyperatingQuestion::where('typerating_id', $typerating_id) ->get() ->random(10); foreach ($questions as $question) { array_push($entry, ['exam_question_id' => $question->id]); } $exam->exam_questions = $entry; $exam->save(); } 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]; } }