Laravel使用innerjoin关联查询时出现SQLSTATE[42S22字段不存在错误如何解决
你的实现方式不正确,错误原因和修复方案如下:
错误根因
报错的直接原因是生成的SQL语句中没有关联quiz_items表,你在关联questions表时用到了quiz_items.question_id字段,但查询逻辑里没有先把quiz_items表加入关联列表,自然会报字段不存在的错误。
除此之外你的实现还有两个逻辑问题:
- 同时使用Eloquent预加载
with('quizItem')和手动写join关联,逻辑重复且容易出现字段冲突、数据重复 - 原有
options表的关联逻辑是用options.question_id和questions.id关联,会把单个题目下的所有选项全部拉取出来,生成笛卡尔积导致大量重复数据,不符合你取quiz对应题目绑定选项的需求
修复方案
推荐优先使用Eloquent嵌套预加载实现,不需要手动写join,逻辑更清晰:
- 先确认模型关联定义正确:
// Quiz 模型新增关联 public function quizItems() { return $this->hasMany(QuizItem::class); } // QuizItem 模型新增关联 public function question() { return $this->belongsTo(Question::class); } public function option() { return $this->belongsTo(Option::class); }
- 直接嵌套预加载关联数据即可:
$quizzes = Quiz::with(['User', 'user_info', 'company', 'quizItems.question', 'quizItems.option']) ->where('finished', 0) ->orderBy('created_at', 'DESC') ->get();
如果需要手动用join实现,调整后的代码如下:
$quizzes = Quiz::with('User','user_info','company') // 先关联quiz_items表 ->join('quiz_items', 'quiz_items.quiz_id', '=', 'quizzes.id') ->join('questions', 'quiz_items.question_id', '=', 'questions.id') // 关联quiz_item对应的指定选项,不要关联题目下所有选项 ->join('options', 'options.id', '=', 'quiz_items.option_id') ->where('quizzes.finished', '=', 0) // 排序字段指定表名,避免多表同名字段冲突 ->orderBy('quizzes.created_at','DESC') ->get();
内容的提问来源于stack exchange,提问作者iSnuff
相关产品推荐
相关产品推荐

