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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:37:16