Skip to content

Model

Type-safe generic ORM in Go Web Frame.

Define Entity

type User struct {
    Id         uint      `gorm:"primaryKey;autoIncrement" json:"id"`
    Name       string    `gorm:"size:255" json:"name"`
    CreateTime time.Time `json:"createTime"`
}

Define Model

type UserModel struct {
    *model.Model[*User]
}

func (m *UserModel) Init(db *db.DB, ctx *core.Context) error {
    m.Model = model.NewModel[*User](db, "t_user")
    return m.CreateTable()
}

Register Model

builder.Model(&UserModel{})

CRUD Operations

userModel := wf.GetModel[*UserModel](ctx)

// Query
users, err := userModel.Query().Where("id > ?", 10).All()
user, err := userModel.Query().Where("id = ?", 1).One()
count, err := userModel.Query().Count()

// Save
user := &User{Name: "alice"}
err := userModel.Save(user)

// Update
err := userModel.Update().Where("id = ?", 1).UpdateColumn("name", "bob")

// Delete
err := userModel.Delete().Where("id = ?", 1).Delete()

EntryModel

For entities with a primary key. EntryModel accepts two type parameters: T (entity type) and PK (primary key type).

type UserModel struct {
    *model.EntryModel[*User, uint]
}

// Additional methods:
user, err := userModel.FindByPK(1)
users, err := userModel.FindAll()
err := userModel.DeleteByPK(1)
pageAble, err := userModel.Query().PageForWeb(page)

EntryModel vs Raw GORM

EntryModel and Model are convenience wrappers that reduce boilerplate code. They are built on top of GORM β€” you can skip these wrappers entirely and use GORM's native API directly:

// Option 1: Use EntryModel (recommended for common CRUD, less boilerplate)
user, err := userModel.FindByPK(1)

// Option 2: Use GORM directly (more flexible for complex queries)
// Get *gorm.DB via GetGorm() and use the full GORM ecosystem
var user User
err := db.GetGorm().First(&user, 1).Error

When EntryModel's built-in methods are insufficient (complex JOINs, subqueries, window functions, etc.), using the GORM ecosystem directly is the best choice. You can mix both approaches freely β€” the framework imposes no restrictions.

Query Builder

userModel.Query().
    Where("status = ?", 1).
    Order("id desc").
    List(10)

Pagination

page := &web.Page{PageNo: 1, PageSize: 10}
users, total, err := userModel.Query().Page(page)

// Web pagination
pageAble, err := userModel.Query().PageForWeb(page)