Laravel中如何按quiz_id关联展示对应数据?
Laravel数据关联筛选展示问题
我是Laravel新手,在处理数据关联展示时遇到问题。想要通过quiz_id筛选数据并在预览页面展示对应的内容,但当前页面显示了所有数据,希望得到解决思路。
视图代码
<form action="/groups/preview/index/question" method="POST" enctype="multipart/form-data"> @csrf <div class="tab-content py-4"> <div class="con-quiz-details"> <div class="cs-quiz-details"> @foreach ($master_quizzes as $master) <div class="banner-quiz">{{ $master->title }}</div> @endforeach </div> @foreach ($master_questions as $quest) <div class="cs-quiz-details"> <div class="cs-quiz-header"> <div class="mb-3"> <div class=""></div> <label for="title" class="form-label soal-quiz">{{ $quest->questions }}</label> </div> <h6 class="respon mt-5"></h6> <div class="input-group mb-2"> <input type="text" class="form-control" placeholder="{{ $quest->answer_a }}" value="{{ old('answer_a') }}" readonly> <div class="input-group-text "> <input class="form-check-input mt-0 question-radio" id="correct_answer" type="radio" name="correct_answer[0]" value="A" aria-label="Radio button for following text input"> </div> @error('answer_a') <div class="invalid-feedback"> {{ $message }} </div> @enderror </div> <div class="input-group mb-2"> <input type="text" class="form-control" placeholder="{{ $quest->answer_b }}" value="{{ old('answer_b') }}" readonly> <div class="input-group-text"> <input class="form-check-input mt-0 question-radio" id="correct_answer" type="radio" name="correct_answer[0]" value="B" aria-label="Radio button for following text input"> </div> @error('answer_b') <div class="invalid-feedback"> {{ $message }} </div> @enderror </div> <div class="input-group mb-2"> <input type="text" class="form-control" id="answer_c" name="answer_c[]" aria-label="Text input with radio button" placeholder="{{ $quest->answer_c }}" value="{{ old('answer_c') }}" autocomplete="off" readonly> <div class="input-group-text"> <input class="form-check-input mt-0 question-radio" id="correct_answer" type="radio" name="correct_answer[0]" value="C" aria-label="Radio button for following text input"> </div> @error('answer_c') <div class="invalid-feedback"> {{ $message }} </div> @enderror </div> <div class="input-group mb-2"> <input type="text" class="form-control" id="answer_d" name="answer_d[]" aria-label="Text input with radio button" placeholder="{{ $quest->answer_d }}" value="{{ old('answer_d') }}" autocomplete="off" readonly> <div class="input-group-text"> <input class="form-check-input mt-0 question-radio" id="correct_answer" type="radio" name="correct_answer[0]" value="D" aria-label="Radio button for following text input"> </div> @error('answer_d') <div class="invalid-feedback"> {{ $message }} </div> @enderror </div> <div class="input-group mb-2"> <input type="text" class="form-control" id="answer_e" name="answer_e[]" aria-label="Text input with radio button" placeholder="{{ $quest->answer_e }}" value="{{ old('answer_e') }}" autocomplete="off" readonly> <div class="input-group-text"> <input class="form-check-input mt-0 question-radio" id="correct_answer" type="radio" name="correct_answer[0]" value="E" aria-label="Radio button for following text input"> </div> @error('answer_e') <div class="invalid-feedback"> {{ $message }} </div> @enderror </div> </div> </div> @endforeach </div> </div> </div> </form>
控制器代码
<?php namespace App\Http\Controllers; use App\Models\Kelas; use App\Models\User; use Illuminate\Http\Request; use App\Models\Master_question; use App\Models\Master_quiz; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; class PreviewController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $kelas = Kelas::all(); $master_quizzes = Master_quiz::all(); $master_questions = Master_question::all(); return view('groups.preview.index', [ 'title' => 'preview', 'users' => User::where('id', auth()->user()->id)->get(), 'master_question' => Master_question::where('quiz_id', auth()->user()->id)->get(), 'kelas' => Kelas::where('user_id', auth()->user()->id)->paginate(2), 'groups.quiz.question', 'master_quizzes' => $master_quizzes, 'master_questions' => $master_questions, ]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param \App\Models\User $user * @return \Illuminate\Http\Response */ public function show(User $user) { return view('preview.index', [ 'user' => $user ]); } /** * Show the form for editing the specified resource. * * @param \App\Models\User $user * @return \Illuminate\Http\Response */ public function edit(User $user) { return view('preview.index', [ 'user' => $user ]); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Models\User $user * @return \Illuminate\Http\Response */ /** * Remove the specified resource from storage. * * @param \App\Models\User $user * @return \Illuminate\Http\Response */ public function destroy(User $user) { // } }
路由代码
<?php use App\Http\Controllers\ClassesController; use App\Http\Controllers\QuestionsController; use App\Http\Controllers\PostsController; use App\Http\Controllers\MemberController; use App\Http\Controllers\PasswordController; use App\Http\Controllers\EmailController; use App\Http\Controllers\TimeController; use App\Models\Kelas; use Illuminate\Support\Facades\Route; use App\Http\Controllers\LoginController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\DiscoverController; use App\Http\Controllers\MessagesController; use App\Http\Controllers\FolderController; use App\Http\Controllers\HomeController; use SebastianBergmann\CodeCoverage\Report\Html\Dashboard; use Symfony\Component\HttpKernel\Profiler\Profile; use App\Http\Controllers\FullCalenderController; use App\Http\Controllers\PreviewController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('home', ['title' => 'Login']); }); Route::get('/login', [LoginController::class, 'index'])->name('login')->middleware('guest'); Route::post('/login', [LoginController::class, 'authenticate']); Route::post('/logout', [LoginController::class, 'logout']); Route::get('/setup-password/{token}', [PasswordController::class, 'edit'])->name('setup-password-get'); Route::post('/setup-password', [PasswordController::class, 'update'])->name('setup-password'); Route::group(['middleware' => ['auth', 'ceklevel:admin']], function () { Route::get('/groups/members/{kelas:slug}/addmember', [EmailController::class, 'show']); // Route::get('/groups/quiz/index', [TimeController::class, 'index']); Route::get('/groups/quiz/index', [TimeController::class, 'create']); Route::get('/groups/quiz/question', [QuestionsController::class, 'create']); Route::get('/email', [EmailController::class, 'kirim']); }); Route::group(['middleware' => ['auth', 'ceklevel:admin,user']], function () { Route::get('/home', function () { return view(('home.index'), ['title' => 'home']); }); Route::get('/home', [HomeController::class, 'index']); Route::get('/classes', [ClassesController::class, 'index']); Route::get('/classes/index/checkSlug', [ClassesController::class, 'checkSlug']); Route::get('/groups/{kelas:slug}/posts', [PostsController::class, 'show']); Route::get('/groups/{kelas:slug}/folder', [FolderController::class, 'show']); Route::get('/groups/members/{kelas:slug}/member', [MemberController::class, 'show']); Route::get('/profile', [ProfileController::class, 'index'])->name('profile'); Route::get('/discover', [DiscoverController::class, 'index']); Route::get('/messages', [MessagesController::class, 'index']); }); Route::post('/profile', [ProfileController::class, 'upload']); Route::post('/groups/quiz/question', [QuestionsController::class, 'store'])->middleware('auth'); Route::post('/groups/quiz/index', [TimeController::class, 'store']); Route::get('/groups/{kelas:slug}/preview/index', [PreviewController::class, 'index']); Route::resource('/profile', ProfileController::class)->middleware('auth'); Route::resource('/classes/index', ClassesController::class)->middleware('auth'); Route::resource('/groups/members/addmember', EmailController::class)->middleware('auth'); Route::get('fullcalender', [FullCalenderController::class, 'index']); Route::post('fullcalenderAjax', [FullCalenderController::class, 'ajax']); // Route::post('kirim', [EmailController::class, 'kirim']);
数据库结构
- master_questions表:

- master_quizzes表:

解决思路
传递筛选所需的quiz_id
- 修改路由,新增quiz参数:
Route::get('/groups/{kelas:slug}/preview/index/{quiz}', [PreviewController::class, 'index']);,直接从URL获取要筛选的quiz实例。 - 也可以通过请求参数(如
?quiz_id=1)传递,在控制器中用$request->query('quiz_id')获取。
- 修改路由,新增quiz参数:
修正控制器查询逻辑
- 替换
Master_question::all(),根据获取到的quiz_id筛选数据:public function index(Kelas $kelas, Master_quiz $quiz) { // 仅获取当前quiz的问题 $master_questions = Master_question::where('quiz_id', $quiz->id)->get(); // 若需要展示所有quiz选项,保留此查询;否则只传递当前quiz即可 $master_quizzes = Master_quiz::all(); return view('groups.preview.index', [ 'title' => 'preview', 'users' => User::where('id', auth()->user()->id)->get(), 'kelas' => Kelas::where('user_id', auth()->user()->id)->paginate(2), 'master_quizzes' => $master_quizzes, 'master_questions' => $master_questions, 'current_quiz' => $quiz ]); } - 注意:当前控制器中
Master_question::where('quiz_id', auth()->user()->id)->get()逻辑错误,quiz_id关联的是master_quizzes表的id,不是用户id,需删除或修正。
- 替换
优化视图展示
- 视图中不再遍历所有
master_quizzes,直接显示当前筛选的quiz标题:{{ $current_quiz->title }} - 确保仅循环展示筛选后的
master_questions数据。
- 视图中不再遍历所有
模型关联优化(可选)
- 在
Master_quiz模型中定义关联:public function questions() { return $this->hasMany(Master_question::class); } - 控制器中直接通过关联获取数据:
$master_questions = $quiz->questions;,代码更简洁。
- 在
内容的提问来源于stack exchange,提问作者Mochammad Efendi
相关产品推荐
相关产品推荐

