我有必须通过结构更新我的对象的函数。当我将代码与更新一起使用时,它会导致类似“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
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
}
你可以试试这个。流程是:管理器->服务->存储库。