模型基类
GORM 实体基类与软删除实现
模型基类
Bamboo Base 提供 GORM 实体基类,包含常用的字段和钩子方法。
BaseEntity - 基础实体
BaseEntity 是所有实体的基础结构体,包含通用字段:
type BaseEntity struct {
// 主键 ID(雪花算法生成)
ID snowflake.SnowflakeID `json:"id" gorm:"primaryKey"`
// 创建时间
CreatedAt time.Time `json:"createdAt" gorm:"autoCreateTime"`
// 更新时间
UpdatedAt time.Time `json:"updatedAt" gorm:"autoUpdateTime"`
}使用示例
type User struct {
BaseEntity // 嵌入基础实体
Username string `json:"username" gorm:"uniqueIndex;size:50"`
Email string `json:"email" gorm:"size:100"`
Password string `json:"-" gorm:"size:255"`
}
// 自动迁移
db.AutoMigrate(&User{})BaseEntitySoftDelete - 软删除实体
BaseEntitySoftDelete 在基础实体上增加了软删除功能:
type BaseEntitySoftDelete struct {
BaseEntity
// 删除时间(非空表示已删除)
DeletedAt gorm.DeletedAt `json:"deletedAt,omitempty" gorm:"index"`
}使用示例
type Article struct {
BaseEntitySoftDelete // 嵌入软删除实体
Title string `json:"title"`
Content string `json:"content"`
AuthorID int64 `json:"authorId"`
}
// 自动迁移
db.AutoMigrate(&Article{})软删除操作
// 软删除(设置 DeletedAt)
db.Delete(&article)
// 查询(自动排除已删除记录)
db.Find(&articles)
// 查询包含已删除记录
db.Unscoped().Find(&articles)
// 永久删除
db.Unscoped().Delete(&article)GORM 钩子方法
BeforeCreate - 创建前钩子
自动设置 ID 和时间戳:
func (e *BaseEntity) BeforeCreate(tx *gorm.DB) error {
if e.ID == 0 {
e.ID = web.Register.SnowflakeNode.Generate()
}
return nil
}BeforeUpdate - 更新前钩子
自动更新更新时间:
func (e *BaseEntity) BeforeUpdate(tx *gorm.DB) error {
e.UpdatedAt = time.Now()
return nil
}GeneProvider 接口
实现 GeneProvider 接口可以让实体指定自己的业务基因:
type GeneProvider interface {
Gene() int64
}实现示例
const GeneUser = 1
type User struct {
BaseEntity
Username string `json:"username"`
}
// 实现 GeneProvider 接口
func (User) Gene() int64 {
return GeneUser
}
// 自定义 BeforeCreate 使用业务基因
func (u *User) BeforeCreate(tx *gorm.DB) error {
if u.ID == 0 {
u.ID = web.Register.SnowflakeNode.GenerateWithGene(u.Gene())
}
return nil
}完整模型示例
用户模型
type User struct {
BaseEntitySoftDelete
Username string `json:"username" gorm:"uniqueIndex;size:50;not null"`
Email string `json:"email" gorm:"size:100;not null"`
Password string `json:"-" gorm:"size:255;not null"`
Avatar string `json:"avatar" gorm:"size:255"`
Status int `json:"status" gorm:"default:1"`
}
func (User) TableName() string {
return "users"
}
func (User) Gene() int64 {
return 1
}订单模型
type Order struct {
BaseEntitySoftDelete
OrderNo string `json:"orderNo" gorm:"uniqueIndex;size:32"`
UserID int64 `json:"userId" gorm:"index"`
TotalAmount float64 `json:"totalAmount" gorm:"type:decimal(10,2)"`
Status int `json:"status" gorm:"default:0"`
}
func (Order) TableName() string {
return "orders"
}
func (Order) Gene() int64 {
return 2
}数据库迁移
func MigrateDB(db *gorm.DB) error {
return db.AutoMigrate(
&User{},
&Order{},
&Article{},
)
}