迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【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で理解度テスト結果を表示させています。

 

あとがき

連想配列と多次元配列について悩まされた。悩まされた結果、かなり理解が深まったので次回は配列について、考え方を記事にしようと思う。