模型 API 参考¶
本文档介绍 Go Web Frame 的模型层 API。
Model[T]¶
model.Model[T] 是泛型模型基类。
创建模型¶
type UserModel struct {
*model.Model[entity.User]
}
func (m *UserModel) Init(db *db.DB, ctx *core.Context) error {
m.Model = model.NewModel[entity.User](db, "t_user")
return m.CreateTable()
}
CRUD 操作¶
// 保存(插入或更新)
user := &entity.User{Name: "Alice", Email: "alice@example.com"}
err := userModel.Save(user)
// 查询所有
users, err := userModel.Query().All()
// 查询单条记录
user, err := userModel.Query().Where("id = ?", 1).One()
// 条件查询
users, err := userModel.Query().Where("status = ?", 1).All()
// 计数
count, err := userModel.Query().Where("status = ?", 1).Count()
// 更新
err := userModel.Update().Where("id = ?", 1).UpdateForMap(map[string]interface{}{
"name": "Bob",
})
// 更新单列
err := userModel.Update().Where("id = ?", 1).UpdateColumn("status", 0)
// 删除
err := userModel.Delete().Where("id = ?", 1).Delete()
EntryModel[T, PK]¶
model.EntryModel[T, PK] 为包含主键的实体提供额外方法。PK 是主键类型,支持 uint、int、string 等(满足 PKConstraint 约束)。
创建 EntryModel¶
type UserModel struct {
*model.EntryModel[entity.User, uint]
}
func (m *UserModel) Init(db *db.DB, ctx *core.Context) error {
m.EntryModel = model.NewEntryModel[entity.User, uint](db, "t_user")
return m.CreateTable()
}
EntryModel 额外方法¶
// 根据主键查找
user, err := userModel.FindByPK(1)
// 根据主键查找(带预加载)
user, err := userModel.FindByPKWithPreload(1, "Profile", "Role")
// 查找所有记录
users, err := userModel.FindAll()
// 查找所有记录(带预加载)
users, err := userModel.FindAllWithPreload("Profile", "Role")
// 根据主键列表批量查找
users, err := userModel.FindAllByPK(1, 2, 3)
// 根据主键列表批量查找(带预加载)
users, err := userModel.FindAllByPKWithPreload([]uint{1, 2, 3}, "Profile")
// 条件查询单条(找不到返回 nil 而不是错误)
user, err := userModel.FindOne("email = ?", "test@example.com")
// 条件查询单条(带预加载)
user, err := userModel.FindOneWithPreload("status = ?", []interface{}{1}, "Profile")
// 根据主键删除
err := userModel.DeleteByPK(1)
// 根据主键更新
err := userModel.UpdateByPK(user)
// 分页查询
page := &web.Page{PageNo: 1, PageSize: 10}
users, total, err := userModel.Page(page)
// 带条件的分页查询
users, total, err := userModel.QueryPage(page, "status = ?", 1)
// 更新单列
err := userModel.UpdateColumn(1, "status", 0)
// 按主键更新 Map
err := userModel.UpdateForMap(1, map[string]interface{}{"name": "Bob"})
// 批量保存
err := userModel.Saves([]entity.User{user1, user2})
// 保存 Map 并返回主键
id, err := userModel.SaveForMapWithPk(map[string]interface{}{"name": "Alice"}, "id")
// 保存 Map 并返回 uint 主键
id, err := userModel.SaveForMapWithUintPk(mapValue, "id")
// 创建记录并返回主键
id, err := userModel.CreateWithPk(user, "id", reflect.Uint)
// ReNew 创建新实例(用于事务)
newModel := userModel.NewEntryModel(tx)
Query[T]¶
model.Query[T] 是查询构建器。
基本查询¶
// 所有记录
users, err := userModel.Query().All()
// 单条记录
user, err := userModel.Query().Where("id = ?", 1).One()
// 计数
count, err := userModel.Query().Where("status = ?", 1).Count()
分页¶
// 分页查询(返回列表和总数)
page := &web.Page{PageNo: 1, PageSize: 10}
users, total, err := userModel.Query().Where("status = ?", 1).Page(page)
// Web 分页(返回 PageAble 结构)
pageAble, err := userModel.Query().Where("status = ?", 1).PageForWeb(page)
// 分页列表(不返回总数)
users, err := userModel.Query().Where("status = ?", 1).ListPage(page)
排序和限制¶
// 排序
users, err := userModel.Query().Order("id desc").All()
// 限制数量
users, err := userModel.Query().Order("id desc").List(100)
// 限制数量并返回总数
users, total, err := userModel.Query().Order("id desc").Size(100)
预加载关联¶
// 预加载关联(GORM eager loading)
users, err := userModel.Query().Preload("Profile").Preload("Role").All()
user, err := userModel.Query().Where("id = ?", 1).Preload("Profile").One()
JOIN 查询¶
链式更新¶
// 使用 Set 链式更新多个字段
err := userModel.Update().
Where("id = ?", 1).
Set("name", "Alice").
Set("status", 1).
Exec()
原生 SQL¶
// 原生 SQL 查询(Where 条件自动合并)
users, err := userModel.Query().Where("status = ?", 1).Exec("SELECT * FROM t_user")
// 原生 SQL 分页查询
users, total, err := userModel.Query().
Where("status = ?", 1).
Order("id desc").
ExecPage(page, "SELECT * FROM t_user WHERE status = ?")
Transaction¶
model.Transaction 提供事务支持。
基本事务¶
tx := ctx.GetTransaction()
err := tx.Exec(func(tx *db.DB) error {
// 在事务中执行操作
userModel := wf.GetReNewModel[*UserModel](tx, ctx)
return userModel.Save(user)
})
命名事务¶
tx := ctx.GetTransactionByName("user_group")
err := tx.Exec(func(tx *db.DB) error {
// 在命名事务中执行操作
userModel := wf.GetReNewModel[*UserModel](tx, ctx)
return userModel.Save(user)
})