id: schema-mixin

title: Mixin

Mixin 允许你创建可重复使用的 ent.Schema 的代码。

ent.Mixin 接口定义如下:

  1. type Mixin interface {
  2. Fields() []ent.Field
  3. }

例子

一个 Mixin 的常见用法是,将通用字段与你的模式混合在一起。

  1. // -------------------------------------------------
  2. // Mixin 定义部分
  3. // TimeMixin 需要实现 ent.Mixin 接口。
  4. // 时间字段及其定义。
  5. type TimeMixin struct{}
  6. func (TimeMixin) Fields() []ent.Field {
  7. return []ent.Field{
  8. field.Time("created_at").
  9. Immutable().
  10. Default(time.Now),
  11. field.Time("updated_at").
  12. Default(time.Now).
  13. UpdateDefault(time.Now),
  14. }
  15. }
  16. // DetailsMixin 需要实现 ent.Mixin 接口。
  17. // 详情字段及其定义。
  18. type DetailsMixin struct{}
  19. func (DetailsMixin) Fields() []ent.Field {
  20. return []ent.Field{
  21. field.Int("age").
  22. Positive(),
  23. field.String("name").
  24. NotEmpty(),
  25. }
  26. }
  27. // -------------------------------------------------
  28. // Schema 定义部分
  29. // User 混入了 TimeMixin 和 DetailsMixin 字段。
  30. // 因此 User 有 5 个字段: `created_at`, `updated_at`, `age`, `name` and `nickname`.
  31. type User struct {
  32. ent.Schema
  33. }
  34. func (User) Mixin() []ent.Mixin {
  35. return []ent.Mixin{
  36. TimeMixin{},
  37. DetailsMixin{},
  38. }
  39. }
  40. func (User) Fields() []ent.Field {
  41. return []ent.Field{
  42. field.String("nickname").
  43. Unique(),
  44. }
  45. }
  46. // Pet 混入了 DetailsMixin 字段。
  47. // 因此 Pet 有 3 个字段: `age`, `name` and `weight`.
  48. type Pet struct {
  49. ent.Schema
  50. }
  51. func (Pet) Mixin() []ent.Mixin {
  52. return []ent.Mixin{
  53. DetailsMixin{},
  54. }
  55. }
  56. func (Pet) Fields() []ent.Field {
  57. return []ent.Field{
  58. field.Float("weight"),
  59. }
  60. }