Eloquent未调用关联表问题:whereHas查询报列不存在错误
首先,你完全没搞错Question::whereHas()的用法——它确实会自动查询questions表,但问题出在你的Question模型和分类模型(比如QuestionCategory)之间的关联关系定义上,和主查询本身无关。
为什么会出现这个错误?
从报错的SQL语句能看出来:Eloquent在构建关联查询时,试图用questions.question_category_id去关联question_categories.id,但你的questions表根本没有question_category_id这个字段。
这是因为Eloquent的关联有默认命名规则:当你在Question模型里定义category关联时,如果没手动指定外键,它会自动推断外键为「关联模型类名的蛇形小写 + _id」。比如如果你的分类模型是QuestionCategory,它就会默认用question_category_id作为外键;但如果你的questions表里实际用来关联分类的字段是category_id(更常见的命名),那就会出现「找不到字段」的错误。
怎么解决?
你需要检查并修正Question模型里的category关联方法:
情况1:你的questions表里的外键是category_id
如果分类模型是QuestionCategory(对应表question_categories),要在关联里明确指定外键:
// 在Question模型中 public function category() { return $this->belongsTo(QuestionCategory::class, 'category_id'); }
如果分类模型就是Category(对应表categories),那默认外键就是category_id,只需确保关联方法正确:
// 在Question模型中 public function category() { return $this->belongsTo(Category::class); }
情况2:你的questions表里确实应该用question_category_id作为外键
那你需要检查数据库表结构,确保questions表存在question_category_id字段(类型要和question_categories.id一致,比如unsigned bigint)。
验证修正
修正关联后,再运行你的代码:
$questions = Question::whereHas('category', function ($q) use ($coh) { $q->where('id', $coh->id); })->get();
就不会再出现字段找不到的错误了。
内容的提问来源于stack exchange,提问作者Elio Martínez Bejarano

