You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 questions
  • master_quizzes表:
    master quizzes

解决思路

  1. 传递筛选所需的quiz_id

    • 修改路由,新增quiz参数:Route::get('/groups/{kelas:slug}/preview/index/{quiz}', [PreviewController::class, 'index']);,直接从URL获取要筛选的quiz实例。
    • 也可以通过请求参数(如?quiz_id=1)传递,在控制器中用$request->query('quiz_id')获取。
  2. 修正控制器查询逻辑

    • 替换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,需删除或修正。
  3. 优化视图展示

    • 视图中不再遍历所有master_quizzes,直接显示当前筛选的quiz标题:{{ $current_quiz->title }}
    • 确保仅循环展示筛选后的master_questions数据。
  4. 模型关联优化(可选)

    • 在Master_quiz模型中定义关联:
      public function questions()
      {
          return $this->hasMany(Master_question::class);
      }
      
    • 控制器中直接通过关联获取数据:$master_questions = $quiz->questions;,代码更简洁。

内容的提问来源于stack exchange,提问作者Mochammad Efendi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 07:03:18