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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:45:24