菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
15
0

gorm 关系一对一,一对多,多对多查询

原创
05/13 14:22
阅读数 813

要实现的功能.
文章属于一个分类.
文章有多个标签

相关表四张.表提前在数据库建立的.没有外键关系

  • 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"
gorm 关系一对一,一对多,多对多查询

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
}

使用Preload方法,直接如上面的查找方式就可以了,查出来的结果如下
gorm 关系一对一,一对多,多对多查询
以上内容如有错误,或者你们有不懂的地方欢迎随时交流.一起进步

本作品采用《CC 协议》,转载必须注明作者和本文链接

发表评论

0/200
15 点赞
0 评论
收藏
为你推荐 换一批