关于 Gorm 关联查询的问题,纠结许久,求解

发布于 2022-09-06 12:23:18 字数 1436 浏览 40 评论 0

一、结构体定义

type Article struct {
    ID int `gorm:"primary_key" json:"id"`
    TagID int `json:"tag_id"`
    Tag   Tag `json:"tag"`
    ...
}

type Tag struct {
    ID uint `gorm:"primary_key" json:"id"`
    Name string `json:"name"`
    ...
}

二、调用方法

单个查询
func GetArticle(id int) (article Article) {
    db.Where("id = ?", id).First(&article)
    db.Model(&article).Related(&article.Tag)

    return 
}

问题

现在问题是,单个查询可以,但是假设是使用Find呢,Related那句关联查询,显然有问题,
因为article已经是多个了,应该如何写??

func GetArticles(id int) (article []Article) {
    db.Where("id = ?", id).Find(&article)
    
    //注,这里的关联查询就显然有问题了,此处应该如何改写?
    db.Model(&article).Related(&article.Tag)

    return 
}

1、循环的话应该不可能吧???

2、JOIN 查询构造器,应该可以实现,但是要把关联的字段也定义在结构体上(感觉不大好,而且属于绕过当前问题)

ps: Gorm文档看了一大波,也又百又谷了不少;但是没看到/解决到我的疑问,求助求解

谢谢!!!


补充 - 表结构:

CREATE TABLE `test_article` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `tag_id` int(10) unsigned DEFAULT '0' COMMENT '标签ID',
   ...
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章管理';

CREATE TABLE `test_tag` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '' COMMENT '标签名称',
  ...
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章标签管理';

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

羞稚 2022-09-13 12:23:18

已解决

最后在stackoverflow找到了答案,采用Preload的方式解决

而在不采用Preload、JOIN查询构造器的情况下,循环查询关联的确是目前的唯一办法


struct字段按场景来说没有错,大舒说的是另外的情况,不能解决我当前问题,感谢他的回答

错々过的事 2022-09-13 12:23:18

目测应该是struct的字段问题。

如果你这个按照官方例子来改的话,
Tag需要加一个字段ArticleId,
然后查询时自然会把ArticleId当做Article模型的外键来查询。

type Tag struct {
    ID uint `gorm:"primary_key" json:"id"`
    Name string `json:"name"`
    ArticleId int
    ...
}

当然,也可以用注释指定X列配X列:

Specify Foreign Key & Association Key

type Profile struct {
  gorm.Model
  Name   string
  UserID uint
}

type User struct {
  gorm.Model
  Refer   uint
  Profiles []Profile `gorm:"ForeignKey:UserID;AssociationForeignKey:Refer"`
}

包括gorm.Model在内,一股浓浓的laravel风格。

另外似乎你的article定义也有问题。

一对多情况下:

type Article struct {
    ID int `gorm:"primary_key" json:"id"`
    Tags   []Tag `json:"tags"`
    ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文