Laravel多表查询遇'id'字段歧义错误,需返回指定格式数据
解决Laravel多表关联查询的字段歧义及关联错误问题
你的代码存在两个核心问题,导致SQL执行报错:
问题1:字段歧义
查询的id、subject_id等字段在多个关联表中存在(比如questionbank和quizzes都有id),SQL无法确定要取哪个表的字段,因此抛出Column 'id' in field list is ambiguous错误。
问题2:关联条件错误
第一个join的关联条件写错了:questionbank_id.id是无效的,中间表questionbank_quizzes中存储关联关系的字段应该是questionbank_id(对应questionbank表的id),而非questionbank_id.id;另外你还把quiz_id写成了quize_id,这也会导致关联失败。
修正后的代码
$questions = DB::table('questionbank') ->join('questionbank_quizzes', 'questionbank_quizzes.questionbank_id', '=', 'questionbank.id') ->join('quizzes', 'quizzes.id', '=', 'questionbank_quizzes.quiz_id') // 修正quize_id为quiz_id ->where('questionbank.subject_id', '=', $request->subject_id) // 指定subject_id所属表 ->select( 'questionbank.id', 'questionbank.subject_id', 'questionbank.topic_id', 'questionbank.question_type', 'questionbank.question', 'questionbank.marks', 'questionbank.difficulty_level', 'questionbank.status', 'quizzes.title as quiz_title' // 给title起别名,避免字段冲突(可选,但更清晰) ) ->get();
说明
- 所有查询字段都明确指定所属表(比如
questionbank.id),彻底解决字段歧义问题; - 修正了关联条件中的字段名错误,确保关联关系正确;
- 给
quizzes.title起别名quiz_title,可以让返回的字段名更直观,也避免和其他可能的title字段冲突; - 返回的结果会包含你需要的所有字段,格式符合要求:
{id: 2665, subject_id: "78", topic_id: "95", question_type: "radio", ..., quiz_title: "xxx"}
内容的提问来源于stack exchange,提问作者Navin Singh
相关产品推荐
相关产品推荐

