如何使用Laravel Eloquent在测验应用程序中获取单个问题类别

v8wbuo2f  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(131)

我想选择一个用户可以通过选项选择的单一问题类别。我已经尝试通过在线找到的资源执行此操作。
类别页面:

@foreach($categories as $category)
            <section>
                <a href="#" class="image">
                    <img src="{{asset('images/pic09.jpg')}}" alt="" data-position="top center" />
                </a>
                <div class="content">
                    <div class="inner">
                        <header class="major">
                            <h3>{{$category->name}}</h3>
                        </header>
                        <p></p>
                        <ul class="actions">
                            <li><a href="/test/{{$category->id}}" class="button">Learn more</a></li>
                        </ul>
                    </div>
                </div>
            </section>
        @endforeach

这是我正在使用的TestController,显示控制器可能会随机选择带有category_id的问题和选项:

namespace App\Http\Controllers;

use App\Category;
use App\Http\Requests\StoreTestRequest;
use App\Option;

class TestsController extends Controller
{
    public function show($id)
    {
        $categories = Category::find($id)->with(
            ['categoryQuestions' => function ($query) {
                $query->inRandomOrder()
                    ->with(
                        ['questionOptions' => function ($query) {
                            $query->inRandomOrder();
                        }]
                    );
            }]
        )
            ->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);
    }
}

web.php

// User
Route::group(['as' => 'client.', 'middleware' => ['auth']], function () {
    Route::get('home', 'HomeController@redirect');
    Route::get('dashboard', 'HomeController@index')->name('home');
    Route::resource('/test', 'TestsController');
    Route::get('results/{result_id}', 'ResultsController@show')->name('results.show');
    Route::get('send/{result_id}', 'ResultsController@send')->name('results.send');
});

这是我正在使用的资源中的Blade文件:

@extends('layouts.home')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Test</div>

                <div class="card-body">
                    @if(session('status'))
                        <div class="row">
                            <div class="col-12">
                                <div class="alert alert-success" role="alert">
                                    {{ session('status') }}
                                </div>
                            </div>
                        </div>
                    @endif

                    <form method="POST" action="{{ route('client.test.store') }}">
                        @csrf
                        @foreach($categories as $category)
                            <div class="card mb-3">
                                <div class="card-header">{{ $category->name }}</div>
                
                                <div class="card-body">
                                    @foreach($category->categoryQuestions as $question)
                                        <div class="card @if(!$loop->last)mb-3 @endif">
                                            <div class="card-header">{{ $question->question_text }}</div>
                        
                                            <div class="card-body">
                                                <input type="hidden" name="questions[{{ $question->id }}]" value="">
                                                @foreach($question->questionOptions as $option)
                                                    <div class="form-check">
                                                        <input class="form-check-input" type="radio" name="questions[{{ $question->id }}]" id="option-{{ $option->id }}" value="{{ $option->id }}"@if(old("questions.$question->id") == $option->id) checked @endif>
                                                        <label class="form-check-label" for="option-{{ $option->id }}">
                                                            {{ $option->option_text }}
                                                        </label>
                                                    </div>
                                                @endforeach

                                                @if($errors->has("questions.$question->id"))
                                                    <span style="margin-top: .25rem; font-size: 80%; color: #e3342f;" role="alert">
                                                        <strong>{{ $errors->first("questions.$question->id") }}</strong>
                                                    </span>
                                                @endif
                                            </div>
                                        </div>
                                    @endforeach
                                </div>
                            </div>
                        @endforeach

                        <div class="form-group row mb-0">
                            <div class="col-md-6">
                                <button type="submit" class="btn btn-primary">
                                    Submit
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

如何让Testcontroller从单个类别中选择问题和答案,并保存用户答案的结果?

kcrjzv8t

kcrjzv8t1#

public function index()
    {
        $questions = Category::select('categories.name', 'question_result.points')
            ->join('questions', 'categories.id', '=', 'questions.category_id')
            ->join('question_result', 'questions.id', '=', 'question_result.question_id')
            ->join('results', 'question_result.result_id', '=', 'results.id')
            ->where('results.user_id', auth()->id())
            ->get();

        return view('client.home', compact('questions'));
    }

相关问题