GoLang GORM 更新与更新

问题描述 投票:0回答:1

我有必须通过结构更新我的对象的函数。当我将代码与更新一起使用时,它会导致类似“reflect:在结构值上调用reflect.Value.SetInt”的错误。否则,通过更新,它可以干净地工作。

我的代码:

type UpdateProducRequest struct {
    ID        string `json:"id"`
    BalanceID string `json:"balance_id"`
    IsActive  bool   `json:"is_active"`
    Type      int    `json:"type"`
    Price     int64  `json:"price"`
}

func (s Storage) UpdateProduc(req *UpdateProducRequest) (resp *models.Product, err error) {
    // this clause panic
    // err = db.Model(&models.Product{}).Where("id=?", req.ID).Updates(req).Take(&resp).Error

    // this works fine
    err = db.Model(&models.Product{}).
        Where("id=?", req.ID).
        Update("balance_id", req.BalanceID).
        Update("is_active", req.IsActive).
        Update("type", req.Type).
        Update("price", req.Price).
        .Take(&resp).Error
    return
}

使用更新我必须做什么,因为在我的项目中使用更新很困难,因为某些结构中有很多字段。

go orm sql-update go-gorm
1个回答
0
投票

存储库.go

func (r *Repository) UpdateWithFields(product *models.Product, fields interface{}) error {
        return r.Connection.PsqlDB().Model(product).Updates(fields).Error
    }

服务.去

func (s *Service) UpdateWithFields(product *models.Product, form UpdateForm) error {
    var fields = map[string]interface{}{
        "name": form.Name,
    }
    if form.Description != nil {
        fields["description"] = form.Description
    }
    if form.Category != nil {
        fields["category"] = form.Category
    }
    if form.PixelImage != nil {
        fields["pixel_image"] = form.PixelImage
    }
    if form.IsActive != nil {
        fields["is_active"] = *form.IsActive
    }
    return s.Repository.UpdateWithFields(product, fields)
}

经理去

func (s *ProductManager) Update(form products.UpdateForm, id int) (*models.Product, error) {
    product, err := s.ProductService.FindById(id)
    if err != nil {
        return nil, errors.New(utils.ProductNotFound)
    }

    err = s.ProductService.UpdateWithFields(product, form)
    if err != nil {
        log.Error(err)
        return nil, errors.New(utils.ProductUpdateError)
    }
    return product, nil
}

你可以试试这个。流程是:管理器->服务->存储库。

© www.soinside.com 2019 - 2024. All rights reserved.