Gin中使用 GORM 实现表关联查询

发布于 1周前 作者 itying888 最后一次编辑是 5天前 来自 Go语言

image.png

https://gorm.io/zh_CN/docs/has_many.html

1、一对一

如上图所示,一个文章只有一个分类,article 和 article_cate 之间是 1 对 1 的关系。 文章表中的 cate_id 保存着文章分类的 id。 如果我们想查询文章的时候同时获取文章分类,就涉及到 1 对 1 的关联查询。 foreignkey 指定当前表的外键、references 指定关联表中和外键关联的字段 Article

package models
type Article struct {
Id int `json:"id"` Title string `json:"title"` Description int `json:"description"` CateId string `json:"cate_id"` State int `json:"state"` ArticleCate ArticleCate `gorm:"foreignKey:CateId;references:Id"` }
func (Article) TableName() string {
return "article"
}

ArticleCate

package models
//ArticleCate 的结构体
type ArticleCate struct {
Id int `json:"id"` Title string `json:"title"` State int `json:"state"` }
func (ArticleCate) TableName() string {
return "article_cate"
}

01、查询所有文章以及文章对应的分类信息:

func (con ArticleController) Index(c *gin.Context) {
var articleList []models.Article
models.DB.Preload("ArticleCate").Limit(2).Find(&articleList)
c.JSON(200, gin.H{ "result": articleList, })
}

注意:Preload(“ArticleCate”)里面的 ArticleCate 为 Article struct 中定义的属性 ArticleCate

返回 JSON 数据:

[
{ 
"id": 1, 
"title": "8 月份 CPI 同比上涨 2.8% 猪肉价格上涨 46.7%", 
"description": 0,
"cate_id": "1",
"state": 1, 
"ArticleCate": { 
"id": 1, 
"title": "国内",
"state": 1
}
},
{
"id": 2, 
"title": "中国联通与中国电信共建共享 5G 网络 用户归属不变", 
"description": 0, 
"cate_id": "1",
"state": 1,
"ArticleCate": {
"id": 1, 
"title": "国内", 
"state": 1
}
}
]

02、查询所有文章以及文章对应的分类信息 指定条件:

func (con ArticleController) Index(c *gin.Context) {
var articleList []models.Article
models.DB.Preload("ArticleCate").Where("id>=?", 4).Find(&articleList)
c.JSON(200, gin.H{ "result": articleList, })
}

返回数据:

[
{ 
"id": 4, 
"title": "这些老师的口头禅,想起那些年“被支配的恐惧”了吗",
"description": 0, 
"cate_id": "2", 
"state": 1, 
"ArticleCate": { 
"id": 2,
"title": "国际", 
"state": 1
}
},
{ 
"id": 5, 
"title": "美国空军一号差点遭雷劈,特朗普惊呼:令人惊奇", 
"description": 0,
"cate_id": "3", 
"state": 1,
"ArticleCate": {
"id": 3, 
"title":"娱乐", 
"state": 1
}
}
]

2.一对多 对多在实际项目中用的非常多

比如一个点餐系统:有菜品分类、有菜品。 菜品分类和菜品之间就是一对多的关系

订单表和订单商品表:订单表和订单商品表之间也是一对多的关系

如上图所示,一个分类下面有很多个文章,article_cate 和 article 之间是 1 对多的关系。

文章表中的 cate_id 保存着文章分类的 id。

如果我们想查询文章分类的时候获取分类下面的文章,这个时候就涉及到一对多的关联查询。

ArticleCate

//ArticleCate 的结构体

image.pngimage.png Article image.png

01 查找所有分类以及分类下面的文章信息

func (con ArticleController) Index(c *gin.Context) {
var articleCateList []models.ArticleCate
models.DB.Preload("Article").Find(&articleCateList)
c.JSON(200, gin.H{ 
"result": articleCateList,
})
}

更多详情学习可参考视频:https://www.bilibili.com/video/BV1Rm421N7Jy?vd_source=a67de6c51ef78db9792567aef98dfaf6&spm_id_from=333.788.videopod.episodes&p=66


回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!