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

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,逻辑更清晰:

  1. 先确认模型关联定义正确:
// 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);
}
  1. 直接嵌套预加载关联数据即可:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 10:45:04