为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁花不似锦 2022-09-05 15:47:33
我有以下模型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的一个查询即可做到这一点吗?
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您应该能够使用如下方法执行此操作:


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


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信