关于 Gorm 关联查询的问题,纠结许久,求解
一、结构体定义
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
已解决
最后在stackoverflow找到了答案,采用Preload的方式解决
而在不采用Preload、JOIN查询构造器的情况下,循环查询关联的确是目前的唯一办法
struct字段按场景来说没有错,大舒说的是另外的情况,不能解决我当前问题,感谢他的回答
目测应该是struct的字段问题。
如果你这个按照官方例子来改的话,
Tag需要加一个字段ArticleId,
然后查询时自然会把ArticleId当做Article模型的外键来查询。
当然,也可以用注释指定X列配X列:
包括
gorm.Model
在内,一股浓浓的laravel风格。另外似乎你的article定义也有问题。
一对多情况下: