【Laravelでクイズサイトを作る】問題集を途中から解けるようにする

スポンサーリンク
未分類

クイズサイトを作っています

独学でクイズサイトを作っています。クイズサイトが出来上がるまでの過程を記します!

是非見てみてください。

問題一覧

問題一覧- QuizWiki(クイズウィキ)
様々なタイプの問題を自作し問題集を作ったり,誰かが作った問題で問題集を作ることができる唯一のクイズサイト。作成できる問題は選択問題(2~10択),〇✕問題,記述問題です。

問題集一覧

問題集一覧- QuizWiki(クイズウィキ)
様々なタイプの問題を自作し問題集を作ったり,誰かが作った問題で問題集を作ることができる唯一のクイズサイト。作成できる問題は選択問題(2~10択),〇✕問題,記述問題です。

問題集の回答状況を管理するテーブルを作成する

artisanコマンドでテーブルを作成します。テーブルの構造はこんな感じの想定です。

php artisan make:migration create_book_manage_table
php artisan make:migration create_book_result_table
php artisan make:migration create_book_result_choice_table

問題集管理テーブル(book_manage)の主キーは問題集管理IDをサロゲートキーとします。

問題集IDは問題集テーブルとの外部キー制約を与えます。

Schema::create('book_manage', function (Blueprint $table) {
     $table->id(); //問題集管理ID
     $table->unsignedBigInteger('book_id');
     $table->unsignedBigInteger('user_id');
     $table->boolean('is_end');
     $table->integer('quiz_seq');
     $table->timestamps();
     $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
 });

問題集解いた結果テーブル(book_result)は複合キーとします。

一つの問題集に同じ問題集は入らない想定です。

Schema::create('book_result', function (Blueprint $table) {
     $table->unsignedBigInteger('book_manage_id');
     $table->unsignedBigInteger('quiz_id');
     $table->boolean('result');
     $table->timestamps();
     $table->foreign('quiz_id')->references('id')->on('quizes')->onDelete('cascade');
     $table->foreign('book_manage_id')->references('id')->on('book_manage')->onDelete('cascade');
     $table->primary(['book_manage_id', 'quiz_id']);
 });

過去に解いた問題集の問題でなんの選択肢を選んだかを保存できるようにします。

Schema::create('book_result_choice', function (Blueprint $table) {
     $table->unsignedBigInteger('book_manage_id');
     $table->unsignedBigInteger('quiz_id');
     $table->unsignedBigInteger('choice_id')->nullable();
     $table->text('choice_text')->nullable();
     $table->timestamps();
     $table->foreign('quiz_id')->references('id')->on('quizes')->onDelete('cascade');
     $table->foreign('book_manage_id')->references('id')->on('book_manage')->onDelete('cascade');
     $table->foreign('choice_id')->references('id')->on('choices')->onDelete('cascade');
     $table->primary(['book_manage_id', 'quiz_id']);
 });

ここまで出来たらテーブルを作成するために以下のコマンドを打ちます。

php artisan migrate

うまいことできてそう!

モデルを作成しておく

テーブルができたらもモデルを作成しておきます。DAOみたいなものですね。データ登録したときにcreated_atupdated_atを勝手に更新してくれるので便利ですね。

php artisan make:model BookManage
php artisan make:model BookResult
php artisan make:model BookResultChoice

それぞれのモデルファイルにどのテーブルを対象とするかを設定します。

book_manage

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BookManage extends Model
{
    use HasFactory;

    protected $table = 'book_manage';
}

book_result

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BookResult extends Model
{
    use HasFactory;

    protected $table = 'book_result';
}

book_result_choice

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BookResultChoice extends Model
{
    use HasFactory;

    protected $table = 'book_result_choice';
}

問題を解き終わったときにデータを挿入する

テーブルができたのでデータを追加します。

今回の続きから解き始める機能はログイン後の場合のみを対象とするのでコントローラ側でログイン判定をすることにします。

以下は処理のイメージです。

use App\Models\BookManage;
use App\Models\BookResult;
use App\Models\BookResultChoice;

//問題集画面にアクセスされたとき
function init(){
    //途中から解く場合
    //book_manage,book_result,book_result_choiceテーブルの値を取得する

  //新たに解く場合
    //book_manageテーブルにデータを挿入する
    
}

//回答後に呼ばれるメソッド
function answer(){

    //....問題の正解不正解を判定....

    //ログインしていれば
    if (Auth::check()) {
        //book_resultテーブルを更新する
        //book_result_choiceテーブルを更新する
    }
}

今回はこんな感じです!

コメント

タイトルとURLをコピーしました