【laravel】理解度テストの採点機能を実装
本日は理解度テストの採点機能を実装していきます。
やったこと
- check_test_progressionsテーブルの追加
- モデルの追加、修正
- 採点するアクションを追加
- ルートの追加
- ビューの作成
テーブル追加
check_test_progression
- id integer PK AI
- check_test_id integer
- number_of_right_answers integer
- number_of_problems integer
- user_id integer
- created_at datetime
- updated_at datetime
正解数と問題数を保持します。
モデルの修正
app/CheckTestProgression.php
class CheckTestProgression extends Model { //createする時にuser_idとcurriculum_idを許可 protected $fillable = ['user_id', 'check_test_id']; }
コメントの通りです。
採点するアクションを追加
app/Http/Controller/CheckTestController.php
public function checktest_post(Request $request) { $user_id = (int)Auth::id(); $checktest_id = $request->checktest_id; $problems = CheckTestProblem::where(['checktest_id' => $checktest_id])->get(['id','content']); $number_of_right_answers = 0; //正答数 $number_of_problems = 0; //問題数
//理解度テスト結果表示のためのデータ作成 foreach($problems as $problem){ $answer = CheckTestAnswer::where(['id' => $request->item[$problem->id]])->first(['answer']); $correct_answer = CheckTestAnswer::where(['checktest_problem_id' => $problem->id, 'correct_flg' => 1])->first(['id','answer']); $data[$problem->content][0] = [$problem->id,$request->item[$problem->id],$answer->answer]; $data[$problem->content][1] = [$problem->id,$correct_answer->id,$correct_answer->answer]; // 正答数を計算 if ($request->item[$problem->id] == $correct_answer->id) $number_of_right_answers++; $number_of_problems++; } //生成されるdataのイメージ //$data = [ // '問題文' => [[問題番号,選択した回答番号,選択した回答文],[問題番号,正解の回答番号,正答文]] // '問題1' => [[1,1,'回答1_1'],[problem1,2,'回答1_2']], // '問題2' => [[problem2,5,'回答2_1'],[problem2,6,'回答2_2']] //]; // 初めての理解度テスト受験時は受験結果を追加する $test = "none"; if (CheckTestProgression::where(['user_id' => $user_id, 'check_test_id' => $checktest_id])->count() == 0) { $checktestprogression = new CheckTestProgression; $checktestprogression->fill(['user_id' => $user_id, 'check_test_id' => $checktest_id]); $checktestprogression->save(); $test = "create!"; } $checktestprogression = CheckTestProgression::where(['user_id' => $user_id, 'check_test_id' => $checktest_id]); // 現状の点数 > 今回の点数の場合、更新する if ($number_of_right_answers > $checktestprogression->first()->number_of_right_answers) { $checktestprogression->update(['number_of_right_answers' => (int)$number_of_right_answers, 'number_of_problems' => (int)$number_of_problems]); } return view('checktest.checktestresult', ['data' => $data, 'number_of_right_answers' => $number_of_right_answers, 'number_of_problems' => $number_of_problems]); }
確認テスト表示データは連想配列と多次元配列で作りました。
確認テスト結果の追加と更新はカリキュラムの時とほぼ同じです。
ルートの追加
Route::post('/checktest/result', 'CheckTestController@checktest_post');
ビューの作成
resources/views/checktest/checktestresult.blade.php
@extends('layouts.checktestapp') @section('title', 'checktest_name_result') @section('content') <p>確認テスト結果 {{$number_of_right_answers}}/{{$number_of_problems}}</p> @foreach($data as $key=>$val) <p><?php echo $key; ?></p> <p>あなたの答え</p> <p><?php echo $val[0][1]; ?>:<?php echo $val[0][2]; ?></p> <p>正答</p> <p><?php echo $val[1][1]; ?>:<?php echo $val[1][2]; ?></p> @endforeach @endsection
foreeachで理解度テスト結果を表示させています。
あとがき
連想配列と多次元配列について悩まされた。悩まされた結果、かなり理解が深まったので次回は配列について、考え方を記事にしようと思う。