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

Laravel中如何获取同一问题ID关联的所有测验标题(数组形式)

问题解决:获取同一问题关联的所有测验标题

原查询的问题

当前查询通过左连接关联表后直接get(),会把每个问题-测验的组合都返回成单独一行,导致同一个问题重复出现,且无法将多个关联的测验标题聚合到同一问题记录中。另外你提到使用whereIn时触发Invalid argument supplied for foreach()错误,大概率是传入whereIn的参数不是合法数组(比如传了null、单个值而非数组)。

解决方案

方案1:用分组+聚合函数合并测验标题

通过GROUP_CONCAT(MySQL语法)将同一问题的所有测验标题拼接成字符串,每个问题仅返回一行记录:

$questions = DB::table('questionbank')
    ->leftJoin('questionbank_quizzes', 'questionbank_quizzes.questionbank_id', '=', 'questionbank.id')
    ->leftJoin('quizzes', 'quizzes.id', '=', 'questionbank_quizzes.quize_id')
    ->where('questionbank.subject_id', '=', $request->subject_id)
    ->select([
        'questionbank.id',
        'questionbank.subject_id',
        'topic_id',
        'question_type',
        'question',
        'questionbank.marks',
        'difficulty_level',
        'status',
        // 去重并拼接测验标题,用逗号分隔
        DB::raw('GROUP_CONCAT(DISTINCT quizzes.title SEPARATOR ", ") as quiz_titles')
    ])
    ->groupBy('questionbank.id') // 按问题ID分组,确保每个问题只返回一行
    ->get();

返回结果中quiz_titles字段就是该问题关联的所有测验标题拼接字符串。

方案2:用Eloquent关联(更优雅的ORM方式)

如果项目使用Eloquent模型,先定义多对多关联:

// app/Models/Questionbank.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Questionbank extends Model
{
    public function quizzes(): BelongsToMany
    {
        // 关联Quiz模型,中间表为questionbank_quizzes,外键对应关系
        return $this->belongsToMany(Quiz::class, 'questionbank_quizzes', 'questionbank_id', 'quize_id');
    }
}

然后查询时预加载关联的测验数据:

$questions = \App\Models\Questionbank::where('subject_id', $request->subject_id)
    ->with('quizzes:id,title') // 只加载需要的测验字段,提升性能
    ->get();

在视图中可以直接遍历每个问题的测验集合:

@foreach($questions as $question)
    <div>
        <h3>{{ $question->question }}</h3>
        <p>关联测验:
            @foreach($question->quizzes as $quiz)
                {{ $quiz->title }}@if(!$loop->last), @endif
            @endforeach
        </p>
    </div>
@endforeach

修复whereIn的错误

使用whereIn时必须确保第二个参数是非空数组,示例:

// 正确用法:传入数组类型的问题ID集合
$targetQuestionIds = [1, 5, 7];
$questions = DB::table('questionbank')
    ->whereIn('id', $targetQuestionIds)
    // 后续连接、查询逻辑...
    ->get();

如果仍报错,检查$targetQuestionIds是否为数组,避免传入null、单个数值或字符串。

内容的提问来源于stack exchange,提问作者shubham kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:40:18