混入 (Mixin)
Mixin 允许你创建可重用的 ent.Schema 代码片段,这些代码可以通过组合的方式注入到其他模式中。
ent.Mixin 接口如下:
type Mixin interface {
// Fields 返回要添加到模式中的字段切片。
Fields() []Field
// Edges 返回要添加到模式中的边切片。
Edges() []Edge
// Indexes 返回要添加到模式中的索引切片。
Indexes() []Index
// Hooks 返回要添加到模式中的钩子切片。
// 请注意,混入钩子的执行顺序先于模式钩子。
Hooks() []Hook
// Policy 返回要添加到模式中的隐私策略。
// 请注意,混入策略的执行顺序先于模式策略。
Policy() Policy
// Annotations 返回要添加到模式注解中的模式注解列表。
Annotations() []schema.Annotation
}
示例
Mixin 的一个常见用例是将一组公共字段混入到你的模式中。
package schema
import (
"time"
"entgo.io/ent"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/mixin"
)
// -------------------------------------------------
// 混入定义
// TimeMixin 实现了 ent.Mixin,用于与包模式共享时间字段。
type TimeMixin struct{
// 我们嵌入 `mixin.Schema` 以避免实现其余方法。
mixin.Schema
}
func (TimeMixin) Fields() []ent.Field {
return []ent.Field{
field.Time("created_at").
Immutable().
Default(time.Now),
field.Time("updated_at").
Default(time.Now).
UpdateDefault(time.Now),
}
}
// DetailsMixin 实现了 ent.Mixin,用于与包模式共享实体详情字段。
type DetailsMixin struct{
// 我们嵌入 `mixin.Schema` 以避免实现其余方法。
mixin.Schema
}
func (DetailsMixin) Fields() []ent.Field {
return []ent.Field{
field.Int("age").
Positive(),
field.String("name").
NotEmpty(),
}
}
// -------------------------------------------------
// 模式定义
// User 模式混入了 TimeMixin 和 DetailsMixin 字段,因此
// 拥有 5 个字段:`created_at`, `updated_at`, `age`, `name` 和 `nickname`。
type User struct {
ent.Schema
}
func (User) Mixin() []ent.Mixin {
return []ent.Mixin{
TimeMixin{},
DetailsMixin{},
}
}
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("nickname").
Unique(),
}
}
// Pet 模式混入了 DetailsMixin 字段,因此
// 拥有 3 个字段:`age`, `name` 和 `weight`。
type Pet struct {
ent.Schema
}
func (Pet) Mixin() []ent.Mixin {
return []ent.Mixin{
DetailsMixin{},
}
}
func (Pet) Fields() []ent.Field {
return []ent.Field{
field.Float("weight"),
}
}
内置混入
mixin 包提供了一些内置的混入,可用于向模式添加 create_time 和 update_time 字段。
要使用它们,请按如下方式将 mixin.Time 混入添加到你的模式中:
package schema
import (
"entgo.io/ent"
"entgo.io/ent/schema/mixin"
)
type Pet struct {
ent.Schema
}
func (Pet) Mixin() []ent.Mixin {
return []ent.Mixin{
mixin.Time{},
// 或者,仅使用 mixin.CreateTime 来添加 create_time,
// 仅使用 mixin.UpdateTime 来添加 update_time。
}
}