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
相关产品推荐
相关产品推荐

