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

Go语言中如何关联User与Post结构体并获取文章作者名称?

实现方案

1. 调整结构体与数据库表结构

首先修改Post结构体,新增关联用户ID和作者名称字段;同时数据库的posts表需要添加user_id字段,关联users表的id主键:

type Post struct {
    ID         int
    PostTitle  string
    PostDesc   string
    Created    time.Time
    UserID     int       // 存储关联的用户ID,用于数据库关联查询
    AuthorName string    // 存储查询时获取的作者名称
}

2. 创建文章时关联用户ID

创建新文章时,需要传入当前发布文章的用户ID,将其存入Post的UserID字段后写入数据库:

// 示例创建文章的方法
func (p *PostsModel) CreatePost(post Post) error {
    query := `INSERT INTO posts (post_title, post_desc, created, user_id)
              VALUES ($1, $2, $3, $4)`
    _, err := p.DB.Exec(query, post.PostTitle, post.PostDesc, post.Created, post.UserID)
    return err
}

3. 修改GetPost函数的查询逻辑

在GetPost中使用JOIN语句关联users表,一次性查询出文章信息和对应的作者名称,再将结果扫描到Post结构体的对应字段:

func (p *PostsModel) GetPost(id int) (Post, error) {
    var post Post
    // 关联users表查询作者名称
    query := `SELECT p.id, p.post_title, p.post_desc, p.created, p.user_id, u.name
              FROM posts p
              JOIN users u ON p.user_id = u.id
              WHERE p.id = $1`
    // 扫描查询结果到post结构体的各个字段
    err := p.DB.QueryRow(query, id).Scan(
        &post.ID,
        &post.PostTitle,
        &post.PostDesc,
        &post.Created,
        &post.UserID,
        &post.AuthorName,
    )
    if err != nil {
        return Post{}, err
    }
    return post, nil
}

补充说明

  • 优先存储user_id而非直接存name的原因:用户名称可能存在修改需求,通过ID关联查询能保证每次获取的都是最新的作者名称,避免数据不一致问题。
  • 如果业务场景中作者名称绝对不会变更,也可以在创建文章时直接将name存入posts表的author_name字段,此时查询无需JOIN,直接扫描该字段即可,但这种方式灵活性较差,不推荐。

内容的提问来源于stack exchange,提问作者Awesome Lerman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:45:36