瀏覽代碼

fix(internal/repository): 优化 Web转发编辑逻辑

-改进 EditWebForwarding 函数,确保域名字段总是被正确更新
- 使用两次 Updates 方法,先更新非零值字段,再强制更新域名字段
- 这种方法既保证了域名字段的准确性,又避免了不必要的更新操作
fusu 1 月之前
父節點
當前提交
27598934d6
共有 1 個文件被更改,包括 21 次插入2 次删除
  1. 21 2
      internal/repository/webforwarding.go

+ 21 - 2
internal/repository/webforwarding.go

@@ -60,8 +60,27 @@ func (r *webForwardingRepository) AddWebForwarding(ctx context.Context, req *mod
 }
 
 func (r *webForwardingRepository) EditWebForwarding(ctx context.Context, req *model.WebForwarding) error {
-	if err := r.db.WithContext(ctx).Updates(req).Error; err != nil {
-		return err
+	forceUpdateFields := map[string]interface{}{
+		"domain": req.Domain,
+	}
+	// 核心逻辑:
+	// 1. Model(req): 定位要更新的记录。
+	// 2. Updates(req): 先用 struct 更新。GORM 会自动忽略 req 中的零值字段。
+	//    - 如果 req.Domain 是 "abc",它会被更新。
+	//    - 如果 req.Domain 是 "",它会被忽略。
+	//    - 如果 req.TargetURL 是 "xyz",它会被更新。
+	//    - 如果 req.TargetURL 是 "",它会被忽略。
+	// 3. Updates(forceUpdateFields): 接着用 map 更新。这会无视零值,强制更新 map 中指定的字段。
+	//    - 它会用 req.Domain 的值(无论是 "abc" 还是 "")覆盖上一步的结果。
+	//
+	// 最终效果:
+	// - Domain 字段总能被正确更新(无论新值是不是 "")。
+	// - 其他字段遵循 GORM 的默认行为(非零值才更新)。
+	// - 这一切都在一个 UPDATE 语句中完成。
+	db := r.db.WithContext(ctx).Model(req).Updates(req).Updates(forceUpdateFields)
+
+	if db.Error != nil {
+		return db.Error
 	}
 	return nil
 }