首页 > 解决方案 > 创建一个注册用户可以做的测试部分,但目前测试可以做很多次,我希望他们只能做一次

问题描述

我正在使用 laravel 7

如果用户已经参加了测试,我需要加载另一个不同的视图

这是我的测试控制器

    public function index()
    {
        $categories = Category::with(['categoryQuestions' => function ($query) {
                $query->orderBy('id')
                    ->with(['questionOptions' => function ($query) {
                        $query->orderBy('id');
                    }]);
            }])
            ->whereHas('categoryQuestions')
            ->get();

        return view('client.test', compact('categories'));
    }

    public function store(StoreTestRequest $request)
    {
        $options = Option::find(array_values($request->input('questions')));

        $result = auth()->user()->userResults()->create([
            'total_points' => $options->sum('points')
        ]);

        $questions = $options->mapWithKeys(function ($option) {
            return [$option->question_id => [
                        'option_id' => $option->id,
                        'points' => $option->points
                    ]
                ];
            })->toArray();

        $result->questions()->sync($questions);

        return redirect()->route('client.results.show', $result->id);
    }
}

这是结果表连接到用户表的方式

这是我添加与用户表的关系的迁移;

    class AddRelationshipFieldsToResultsTable extends Migration
{
    public function up()
    {
        Schema::table('results', function (Blueprint $table) {
            $table->unsignedInteger('user_id');

            $table->foreign('user_id', 'user_fk_773765')->references('id')->on('users');
        });
    }
}

标签: laravel

解决方案


更新您的索引方法以检查结果表。假设您有一个Result模型,用于您的results表。

public function index()
{
    $existingTest = Result::where('user_id', Auth::user()->id)->first();
    if(isset($existingTest->id)) {
        //Return your other view or run logic specific to if the user has already done the test.
        return view('client.test-complete');
    }

    $categories = Category::with(['categoryQuestions' => function ($query) {
        $query->orderBy('id')
            ->with(['questionOptions' => function ($query) {
                $query->orderBy('id');
            }]);
    }])->whereHas('categoryQuestions')
       ->get();

    return view('client.test', compact('categories'));
}

推荐阅读