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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:16:09