模型定义
不使用 struct tag 定义表、字段、索引、隐藏字段和模型级行为。
模型实现 Define(*oro.SchemaBuilder)。字段名使用 Go 结构体字段,列名默认转为 snake_case。
type User struct {
oro.Model
softdelete.SoftDeleteFields
Email string
PasswordHash string
Status string
Profile oro.JSONRaw
}
func (User) Define(s *oro.SchemaBuilder) {
s.Table("users")
s.Field("Email").String().Size(160).Unique()
s.Field("PasswordHash").Column("password_hash").String().Hidden()
s.Field("Status").Enum("active", "disabled").Default("active").Index()
s.Field("Profile").JSON().Nullable()
}
oro.Model 只包含 id、created_at、updated_at。需要软删除时显式嵌入 extensions/softdelete 的 softdelete.SoftDeleteFields,默认字段是 DeletedAt,默认列名是 deleted_at。
命名规则
| 项 | 默认 | 覆盖 |
|---|---|---|
| 表名 | 模型名 snake_case 后加 s |
s.Table("users") |
| 列名 | 字段名 snake_case | s.Field("PasswordHash").Column("password_hash") |
| JSON 输出 | 标准 JSON tag 和序列化规则 | 关系可用 JSONName(...) |
字段类型
s.Field("Name").String().Size(120)
s.Field("Description").Text()
s.Field("Enabled").Bool().Default(true)
s.Field("Quantity").Int()
s.Field("Views").BigInt()
s.Field("Price").Decimal(12, 2).Default(0)
s.Field("Payload").Binary()
s.Field("Meta").JSON().Nullable()
s.Field("UUID").UUID()
s.Field("CreatedAt").Timestamp()
s.Field("Birthday").Date()
s.Field("Status").Enum("draft", "published")
还提供 Email、URL、IP、MAC、Phone、Slug、Color、StringArray、IntArray、Point 等语义类型,具体映射由方言处理。
Null 值
type Product struct {
oro.Model
Stock oro.Null[int] `json:"stock"`
}
product.Stock = oro.NullOf(10)
product.Stock = oro.NullZero[int]()
oro.Null[T] 避免普通业务字段大量使用 *int、*string 后取值麻烦。
默认值、Only 和 Omit
s.Field("Price").Uint().Default(0)
s.Field("CreatedAt").Timestamp().DefaultExpr("CURRENT_TIMESTAMP")
写入字段显式控制:
db.Use[Product]().Create(ctx, product, oro.Only("Code", "Price"))
db.Use[Product]().Update(ctx, oro.Map{"Price": 120}, oro.Omit("UpdatedAt"))
Only 表示只写这些字段。Omit 表示排除这些字段:创建时可让数据库默认值生效,更新时表示不修改该字段。
索引
s.Field("Code").String().Unique()
s.Field("Status").String().Index()
s.Field("Title").String().FullText()
s.Index("idx_posts_status", "Status")
s.Unique("uk_posts_slug", "Slug")
s.FullText("ft_posts_title_body", "Title", "Body")
Hidden 和 Virtual
s.Field("PasswordHash").String().Hidden()
s.Field("CommentsCount").Virtual()
Hidden 默认不查询、不序列化。Virtual 不同步为数据库字段,适合承接聚合值。
模型级配置
func (Order) Define(s *oro.SchemaBuilder) {
s.Table("orders")
s.Connection("mysql")
s.Shard("orders", "TenantID")
}
租户相关模型配置见 Tenant 租户扩展。