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
相关产品推荐
相关产品推荐

