Gin中使用 GORM 实现表关联查询
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 的结构体
Article
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,
})
}