mirror of
https://github.com/ent/ent.git
synced 2026-04-29 22:20:54 +03:00
153 lines
3.2 KiB
Markdown
Executable File
153 lines
3.2 KiB
Markdown
Executable File
---
|
|
id: schema-mixin
|
|
title: Mixin
|
|
---
|
|
|
|
A `Mixin` allows you to create reusable pieces of `ent.Schema` code that can be injected into other schemas
|
|
using composition.
|
|
|
|
The `ent.Mixin` interface is as follows:
|
|
|
|
```go
|
|
type Mixin interface {
|
|
// Fields returns a slice of fields to add to the schema.
|
|
Fields() []Field
|
|
// Edges returns a slice of edges to add to the schema.
|
|
Edges() []Edge
|
|
// Indexes returns a slice of indexes to add to the schema.
|
|
Indexes() []Index
|
|
// Hooks returns a slice of hooks to add to the schema.
|
|
// Note that mixin hooks are executed before schema hooks.
|
|
Hooks() []Hook
|
|
// Policy returns a privacy policy to add to the schema.
|
|
// Note that mixin policy are executed before schema policy.
|
|
Policy() Policy
|
|
// Annotations returns a list of schema annotations to add
|
|
// to the schema annotations.
|
|
Annotations() []schema.Annotation
|
|
}
|
|
```
|
|
|
|
## Example
|
|
|
|
A common use case for `Mixin` is to mix-in a list of common fields to your schema.
|
|
|
|
```go
|
|
package schema
|
|
|
|
import (
|
|
"time"
|
|
|
|
"entgo.io/ent"
|
|
"entgo.io/ent/schema/field"
|
|
"entgo.io/ent/schema/mixin"
|
|
)
|
|
|
|
// -------------------------------------------------
|
|
// Mixin definition
|
|
|
|
// TimeMixin implements the ent.Mixin for sharing
|
|
// time fields with package schemas.
|
|
type TimeMixin struct{
|
|
// We embed the `mixin.Schema` to avoid
|
|
// implementing the rest of the methods.
|
|
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 implements the ent.Mixin for sharing
|
|
// entity details fields with package schemas.
|
|
type DetailsMixin struct{
|
|
// We embed the `mixin.Schema` to avoid
|
|
// implementing the rest of the methods.
|
|
mixin.Schema
|
|
}
|
|
|
|
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"),
|
|
}
|
|
}
|
|
```
|
|
|
|
## Builtin Mixin
|
|
|
|
Package `mixin` provides a few builtin mixins that can be used
|
|
for adding the `create_time` and `update_time` fields to the schema.
|
|
|
|
In order to use them, add the `mixin.Time` mixin to your schema as follows:
|
|
```go
|
|
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{},
|
|
// Or, mixin.CreateTime only for create_time
|
|
// and mixin.UpdateTime only for update_time.
|
|
}
|
|
}
|
|
```
|