从GORM中检索多对多结果

时间:2017-07-05 13:44:54

标签: mysql database go go-gorm

我使用gorm映射我的数据库。

我有两个表(serviceresource),具有多对多关系。我在代码中对它们进行建模:

type Service struct {
    BaseModel
    Name      string     `gorm:"not null;unique_index"`
    Resources []Resource `gorm:"many2many:service_resource"`
}

type Resource struct {
    BaseModel
    Name string `gorm:"not null;unique_index"`
}

使用gorm的AutoMigrate创建了以下表格:

Database diagram m2m

(我还执行了原始SQL查询以在映射表中添加id主键。)

要创建新服务,请使用以下代码:

service := Service{
    Name: "core",
    Resources: []Resource{
        {Name: "ec2"},
        {Name: "dynamo"},
    },
}
db.Create(&service)

这会创建所有资源以及服务,并按照预期在service_resource表中填写它们之间的关系。

然而,我的问题是当我查询服务时。我使用以下代码检索所有服务:

services := []model.Service{}
db.Find(&services)

这将成功返回填充的services数组,但每个服务的Resources数组为空:

"services": [
    {
        "ID": 1,
        "Name": "core",
        "Resources": null
    },
    ...
]

我假设gorm会自动填充它。我缺少一些步骤吗?

1 个答案:

答案 0 :(得分:3)

在查询服务之前,您需要Preload资源字段:

services := []model.Service{}
db.Preload("Resources").Find(&services) // error checking ommited

这会正确填充每项服务的Resources字段。