gorm


func UpdateArticleDetails(title, content, cover, desc, tags, keyword string, menuId, categoryId int, isTop, hot, recommend, prod, markdown bool, id int) error {
	// 0 草稿箱 1发布 2垃圾箱
	var save int

	if prod {
		save = 1
	} else {
		save = 0
	}

	a := &models.Article{Id: id}

	if tags != "" {
		a.Tags = &tags
	}

	if categoryId != -1 {
		a.CategoryId = &categoryId
	}

	if keyword != "" {
		a.Keyword = &keyword
	}

	// 开始事务
	tx := db.DbConn.Begin()
	defer tx.Commit()

	if categoryId == -1 {
		err := tx.Model(&a).Updates(map[string]interface{}{"title": title, "cover": cover, "desc": desc, "menu_id": menuId, "category_id": nil, "tags": tags, "hot": hot, "recommend": recommend, "markdown": markdown, "type": save, "update_time": time.Now()}).Error
		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
	} else {
		err := tx.Model(&a).Updates(map[string]interface{}{"title": title, "cover": cover, "desc": desc, "menu_id": menuId, "category_id": categoryId, "tags": tags, "hot": hot, "recommend": recommend, "markdown": markdown, "type": save, "update_time": time.Now()}).Error
		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
	}

	err := tx.Model(&models.ArticleContent{}).Where("article_id = ?", &a.Id).Update("content", content).Error
	if err != nil {
		logger.Error(err.Error())
		tx.Rollback()
		return err
	}

	var count int
	if isTop {
		s := models.System{
			TopId:       sql.NullInt64{Int64: int64(id), Valid: true},
			CreatedTime: time.Now(),
		}
		err = tx.Select([]string{"id"}).Model(&models.System{}).Count(&count).Error
		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
		if count == 0 {
			err = db.DbConn.Create(&s).Error
		} else {
			err = tx.Model(&s).Updates(map[string]interface{}{"top_id": id, "update_time": time.Now()}).Error
		}

		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
	} else {
		s := models.System{
			TopId:       sql.NullInt64{Int64: int64(id), Valid: true},
			CreatedTime: time.Now(),
		}
		err = tx.Select([]string{"id"}).Model(&models.System{}).Count(&count).Error
		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
		if count == 0 {
			err = db.DbConn.Create(&s).Error
		} else {
			err = tx.Model(&s).Updates(map[string]interface{}{"top_id": nil, "update_time": time.Now()}).Error
		}

		if err != nil {
			logger.Error(err.Error())
			tx.Rollback()
			return err
		}
	}

	return nil
}

 

### GORM 的概述 GORM 是一种流行的 Go (Golang) 开源对象关系映射框架,它简化了数据库操作流程并提供了强大的功能支持。通过 GORM,开发者可以轻松实现对多种数据库的支持以及复杂的查询逻辑[^1]。 以下是关于 GORM 使用的一些核心概念和方法: --- ### 数据库连接配置 在使用 GORM 前,需先完成数据库的初始化工作。以下是一个典型的 MySQL 连接示例代码片段: ```go package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // db 已经准备好用于后续的操作 } ``` 上述代码展示了如何利用 `mysql` 驱动程序来创建一个到 MySQL 数据库的连接实例。 --- ### 定义模型结构体 GORM 支持将 Go 结构体映射为数据库中的表。下面展示了一个简单的用户模型定义方式: ```go type User struct { ID uint `json:"id"` Name string `json:"name"` Email string `json:"email"` Password string `json:"-"` } // 自动迁移会基于此结构体生成对应的 SQL 表 db.AutoMigrate(&User{}) ``` 这里需要注意的是,字段标签(如 `json` 和其他自定义标签)可用于控制序列化行为或指定额外属性。 --- ### CRUD 操作基础 #### 创建记录 向数据库插入新数据可以通过调用 `.Create()` 方法完成: ```go user := User{Name: "John Doe", Email: "john@example.com", Password: "secret"} result := db.Create(&user) if result.Error != nil { fmt.Println(result.Error) } else { fmt.Printf("New user created with ID %d\n", user.ID) } ``` #### 查询单条或多条记录 执行简单查询可采用如下形式: ```go var users []User db.Where("age > ?", 18).Find(&users) fmt.Printf("%v\n", users) ``` 对于更复杂的情况,则推荐构建链式条件表达式或者直接编写原生 SQL。 #### 更新现有数据 更新特定列可通过以下方式进行: ```go db.Model(&user).Update("Name", "Jane Doe") // 或者批量修改多个字段 updates := map[string]interface{}{"Age": 25, "Active": true} db.Model(&user).Updates(updates) ``` #### 删除记录 删除某条记录只需调用相应函数即可: ```go db.Delete(&user) ``` 以上即涵盖了基本增删改查的功能介绍。 --- ### 文档与进一步学习资源 官方文档地址位于 https://gorm.io/docs/index.html ,其中包含了详尽的例子和技术细节说明。建议深入阅读以便掌握更多高级特性比如事务处理、预加载关联等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值