GORM多对一关系查询:如何通过Post内容集合获取User
通过指定帖子内容查询对应的用户
结构体定义
type User struct { ID string Name string Posts []Post `gorm:"foreignKey:UserID"` } type Post struct { ID string Content string UserID string User *User }
需求与问题说明
已知用户Bob发布了三条内容分别为Hello、Good Morning、Goodbye的帖子,需要根据这三条帖子内容从数据库查询对应的Bob,但以下代码无法获取目标用户:
原错误代码
user := User{ Posts: []Post{ { Content: "Hello", }, { Content: "Good Morning", }, { Content: "Goodbye", }, } } db.Preload("Post").Find(&user)
可行实现方法
原代码问题在于:Preload参数写错(应为Posts而非Post),且直接通过结构体嵌套无法实现“匹配所有指定帖子内容”的查询逻辑,需通过关联查询结合条件筛选实现。
方法一:关联查询匹配全部指定内容
var user User // 关联用户表与帖子表,筛选出拥有全部三个指定内容帖子的用户 db.Joins("JOIN posts ON users.id = posts.user_id"). Where("posts.content IN ?", []string{"Hello", "Good Morning", "Goodbye"}). Group("users.id"). Having("COUNT(DISTINCT posts.content) = ?", 3). First(&user)
方法二:关联查询+预加载用户全部帖子
如果需要同时获取该用户的所有帖子,可添加Preload:
var user User db.Preload("Posts"). Joins("JOIN posts ON users.id = posts.user_id"). Where("posts.content IN ?", []string{"Hello", "Good Morning", "Goodbye"}). Group("users.id"). Having("COUNT(DISTINCT posts.content) = ?", 3). First(&user)
逻辑说明
Joins建立用户表与帖子表的关联,通过user_id字段关联Where筛选出帖子内容在指定列表中的记录Group按用户ID分组,确保每个用户仅返回一条结果Having确保该用户的帖子包含所有指定的三个内容,DISTINCT避免重复内容干扰统计结果
内容的提问来源于stack exchange,提问作者Andrew Baker
相关产品推荐
相关产品推荐

