Files
ent/doc/md/schema-mixin.md
Guilherme Oenning 54d0d7fe53 docs: fix a minor doc error (#67)
Summary:
closes https://github.com/facebookincubator/ent/issues/64
Pull Request resolved: https://github.com/facebookincubator/ent/pull/67

Differential Revision: D17782362

Pulled By: alexsn

fbshipit-source-id: eba3e2beb6e3f4ee5fc848ef67c8547a969f7b1e
2019-10-06 04:32:36 -07:00

1.7 KiB
Executable File

id, title
id title
schema-mixin Mixin

A Mixin allows you to create reusable pieces of ent.Schema code.

The ent.Mixin interface is as follows:

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

Example

A common use case for Mixin is to mix-in a list of common fields to your schema.

// -------------------------------------------------
// Mixin definition

// TimeMixin implements the ent.Mixin for sharing
// time fields with package schemas.
type TimeMixin struct{}

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 implements the ent.Mixin for sharing
// entity details fields with package schemas.
type DetailsMixin struct{}

func (DetailsMixin) Fields() []ent.Field {
	return []ent.Field{
		field.Int("age").
			Positive(),
		field.String("name").
			NotEmpty(),
	}
}

// -------------------------------------------------
// Schema definition

// User schema mixed-in the TimeMixin and DetailsMixin fields and therefore
// has 5 fields: `created_at`, `updated_at`, `age`, `name` and `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 schema mixed-in the DetailsMixin fields and therefore
// has 3 fields: `age`, `name` and `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"),
	}
}