Go语言中如何使用Gorm结合Preload与Where过滤关联数据
解决Gorm中结合Preload与Where查询类别ID为1的事件问题
你的原代码问题在于直接使用events.categories.id作为Where条件,Gorm无法识别这种跨表字段写法,以下是两种正确的实现方式:
方式一:通过事件模型的关联字段过滤(推荐)
如果你的Event结构体定义了CategoryID字段(一对一关联的外键),直接过滤该字段即可,同时用Preload预加载关联的类别信息:
var events []Event Db.Preload("Category").Where("category_id = ?", 1).Find(&events)
方式二:使用Joins关联查询(适合复杂关联场景)
通过JOIN语句关联categories表,再过滤类别ID,确保只获取关联类别为1的事件:
var events []Event Db.Joins("JOIN categories ON categories.id = events.category_id"). Where("categories.id = ?", 1). Preload("Category"). Find(&events)
补充:仅预加载符合条件的关联数据
如果你的需求是保留所有事件,但仅预加载其中ID为1的类别数据(而非过滤事件本身),可以在Preload中添加条件:
var events []Event Db.Preload("Category", "id = ?", 1).Find(&events)
内容的提问来源于stack exchange,提问作者iwasaki
相关产品推荐
相关产品推荐

