gorm 关系一对一,一对多,多对多查询
Posted haima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gorm 关系一对一,一对多,多对多查询相关的知识,希望对你有一定的参考价值。
建表
要实现的功能.
文章属于一个分类.
文章有多个标签
相关表四张。表提前在数据库建立的。没有外键关系
- article 表
- tag 表.
- article_tag 表
- category 表
//文章表
type Article struct {
Id int `json:"id"`
Title string `json:"title"`
CategoryId int `json:"category_id"`
Category Category `json:"category";gorm:"foreignkey:CategoryID"`//指定关联外键
Tag []Tag `gorm:"many2many:article_tag" json:"tag"`//多对多关系.
//article_tag表默认article_id字段对应article表id.tag_id字段对应tag表id
//可以把对应sql日志打印出来,便于调试
}
//文章_标签中间表
type ArticleTag struct {
Id int `json:"id" `
ArticleId string `json:"article_id"`
TagId string `json:"tag_id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
}
//标签表
type Tag struct {
Id int `json:"id" `
TagName string `json:"tag_name"`
}
//分类表
type Category struct {
ID int `json:"id"`
CategoryName string `json:"category_name"`
Status int `json:"status"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
查一列
//远程一对多.一对一
func (a *Article) ListArticle(title string) (Article, error) {
query := database.GormPool
var article Article
query.Where("title like ?", "%"+title+"%").First(&article)
fmt.Println(article)
err := query.Model(&article).
Related(&article.Category).
Related(&article.Tag, "tag").
Find(&article).Error
if err != nil && err != gorm.ErrRecordNotFound {
return article, nil
}
return article, err
}
结果如图:一个分类,多个标签
使用 Related 方法,需要先把 Article 查询好,
然后根据 Article 定义中指定的 CategoryID 去查找 Category,
查找标签,就直接定义标签接收 Tag 切片:然后写 gorm 的表对应关系:"many2many:article_tag"
查多列表
func (a *Article) ListArticle(title string) (articles []Article, err error) {
query := database.GormPool
err = query.Model(articles).
Where("title like ?", "%"+title+"%").
Preload("Category").
Preload("Tag").Find(&articles).Error
if err != nil && err != gorm.ErrRecordNotFound {
return
}
return
}
以上是关于gorm 关系一对一,一对多,多对多查询的主要内容,如果未能解决你的问题,请参考以下文章