猿问

使用一个查询获取嵌套对象

我有以下模型


type Instance struct {

    gorm.Model

    Name               string `gorm:"unique;"`

    UserID             uint

    GroupID            uint

    StackID            uint

    RequiredParameters []InstanceRequiredParameter `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"requiredParameters,omitempty"`

    OptionalParameters []InstanceOptionalParameter `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"optionalParameters,omitempty"`

    DeployLog          string                      `gorm:"type:text"`

}


type InstanceRequiredParameter struct {

    gorm.Model

    InstanceID               uint                   `gorm:"index:idx_instance_required_parameter,unique"`

    StackRequiredParameterID uint                   `gorm:"index:idx_instance_required_parameter,unique"`

    StackRequiredParameter   StackRequiredParameter `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`

    Value                    string

}


type InstanceOptionalParameter struct {

    gorm.Model

    InstanceID               uint                   `gorm:"index:idx_instance_optional_parameter,unique"`

    StackOptionalParameterID uint                   `gorm:"index:idx_instance_optional_parameter,unique"`

    StackOptionalParameter   StackOptionalParameter `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`

    Value                    string

}


type StackRequiredParameter struct {

    gorm.Model

    StackID uint   `gorm:"index:idx_name_required_parameter,unique"`

    Name    string `gorm:"index:idx_name_required_parameter,unique"`

}


type StackOptionalParameter struct {

    gorm.Model

    StackID uint   `gorm:"index:idx_name_optional_parameter,unique"`

    Name    string `gorm:"index:idx_name_optional_parameter,unique"`

}

我正在尝试获取一个包含参数的实例,并且也检索了StackRequiredParameter/StackOptionalParameter,因为我需要Name属性。


但这需要3个查询。任何人都可以建议一种方法,只需使用Gorm的一个查询即可做到这一点吗?


繁花不似锦
浏览 102回答 1
1回答

慕丝7291255

您应该能够使用如下方法执行此操作:func (r instanceRepository) FindWithParametersById(id uint) (*model.Instance, error) {    var instance *model.Instance    err := r.db.Preload("RequiredParameters.StackRequiredParameter").Preload("OptionalParameters.StackOptionalParameter").First(&instance, id).Error    if err != nil {        return nil, err    }    return instance, nil}它仍将在数据库中执行多个查询,因为每个调用都会运行一个单独的查询,但至少您不必编写所有这些代码。Preload
随时随地看视频慕课网APP

相关分类

Go
我要回答