Laravel 9关联查询:如何按test_id筛选关联的响应数据?
Laravel 9 关联关系筛选问题解决方案
问题1:能否从控制器向模型的response()方法传入参数?
不能直接给模型的关联方法传参数,但可以通过关联查询闭包或动态关联方法这两种方式,实现带参数的关联筛选逻辑。
问题2:按test_id筛选关联响应的实现方案
方案1:控制器中用闭包动态过滤(快速实现)
直接在with方法里传入闭包,给关联的response添加test_id筛选条件:
function testOngoing($test_id, $history_id) { $test = TestSeries::find($test_id); $history = $history_id; $questions = TestSeriesQuestion::where('test_id', $test_id) ->with(['response' => function ($query) use ($test_id) { $query->where('test_id', $test_id); }]) ->paginate(1); $data = compact('test', 'questions', 'history'); return view('test-series/test-question')->with($data); }
这样加载的每个question只会关联对应当前test_id的响应数据,不会返回历史提交记录。
方案2:定义动态关联方法(适合多场景复用)
如果需要在多个地方复用这个筛选逻辑,可以在TestSeriesQuestion模型中定义一个带参数的关联方法:
// app/Models/TestSeriesQuestion.php public function responseForTest($test_id) { return $this->hasOne(TestSeriesResponse::class, 'question_id', 'id') ->where('test_id', $test_id); }
然后在控制器中调用这个关联时,通过闭包传入test_id:
function testOngoing($test_id, $history_id) { $test = TestSeries::find($test_id); $history = $history_id; $questions = TestSeriesQuestion::where('test_id', $test_id) ->with(['responseForTest' => function ($query) use ($test_id) { $query->where('test_id', $test_id); }]) ->paginate(1); $data = compact('test', 'questions', 'history'); return view('test-series/test-question')->with($data); }
也可以在查询完questions后手动加载关联,适合需要延迟加载的场景:
$questions = TestSeriesQuestion::where('test_id', $test_id)->paginate(1); $questions->each(function ($question) use ($test_id) { $question->load('responseForTest:' . $test_id); });
内容的提问来源于stack exchange,提问作者Imdadullah Babu
相关产品推荐
相关产品推荐

