在事务中创建一对一关联



UserService.go

func (service UserService) Create(model *models.User) (*models.User, error) {
    db, err := database.GetConnection()
    if err != nil {
        return nil, err
    }
    tx := db.Begin()
    if tx.Error != nil {
        fmt.Errorf("%v", err)
        return nil, err
    }
    if err := tx.Create(model).Error; err != nil {
        fmt.Errorf("%v", err)
        tx.Rollback()
        return nil, err
    }
    if err := tx.Save(model).Error; err != nil {
        fmt.Errorf("%v", err)
        tx.Rollback()
        return nil, err
    }
    if err := service.UserProfileService.Create(tx, model); err != nil {
        fmt.Errorf("%v", err)
        tx.Rollback()
        return nil, err
    }
    if err := tx.Commit().Error; err != nil {
        fmt.Errorf("%v", err)
        return nil, err
    }
    return model, nil
}

UserProfileService.go

func (UserProfileService) Create(tx *gorm.DB, user *models.User) error {
    if err := tx.Create(models.UserProfile{User: user}).Error; err != nil {
        return err
    }
    return nil
}

用户.go

type User struct {
    Id               *uuid.UUID     `json:"id" gorm:"not null;primary_key;type:uuid;default:uuid_generate_v4();"`
    Name             *string        `json:"name" gorm:"not null;type:varchar(255);"`
    CreatedAt        time.Time      `json:"createdAt" gorm:"type:timestamp;default:now()"`
    UpdatedAt        time.Time      `json:"updatedAt" gorm:"type:timestamp;default:now()"`
    DeletedAt        *time.Time     `json:"deleteAt,omitempty" gorm:"type:timestamp;"`
}
func (User) TableName() string {
    return "users"
}

UserProfile.go

type UserProfile struct {
    User        *User      `json:"id" gorm:"not null;primary_key;foreignkey:Id;type:uuid;default:uuid_generate_v4();"`
    Id          *uuid.UUID `json:"id" gorm:"not null;type:uuid"`
    Description string     `json:"description" gorm:"not null;type:varchar(255)"`
    UpdatedAt   time.Time  `json:"updatedAt" gorm:"type:timestamp;default:now()"`
}
func (UserProfile) TableName() string {
    return "users_profile"
}

因此,每个用户必须只有一个用户配置文件,这就是为什么用户配置文件的主键也是一个外键(用户(id((。但是当我尝试提出请求时,我收到此错误:(using unaddressable value)

关于如何使其工作的任何想法?

您在UserProfileService.go中插入的模型不是指针,这就是您收到unaddressable错误的原因。

func (UserProfileService) Create(tx *gorm.DB, user *models.User) error {
    if err := tx.Create(*models.UserProfile{User: user}).Error; err != nil {
        return err
    }
    return nil
}

tx.Create调用中的引用很可能会修复您的错误。如果没有,请发布完整的错误。

最新更新