3

我是 golang 的新手,并且正在使用ent框架作为 ORM。每个模式都应该有字段created_atand updated_at,我想写一次而不是为每个模式写它,即:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("id"),
        field.String("name").MaxLen(70),
        field.String("email"),
        field.Time("created_at").Default(time.Now).Immutable(),
        field.Time("updated_at").Default(time.Now).UpdateDefault(time.Now),
    }
}

.....

func (Product) Fields() []ent.Field {
    return []ent.Field{
        field.Int("id"),
        field.String("name").MaxLen(70),
        field.Float("price"),
        field.Time("created_at").Default(time.Now).Immutable(),
        field.Time("updated_at").Default(time.Now).UpdateDefault(time.Now),
    }
}

我来自 OOP lagnageus,在那里我可以使用BaseEntity所有其他实体从它继承的某种方式来做到这一点,但不知道在这种情况下如何做到这一点。

4

1 回答 1

3

您可以使用MixIn,它允许您创建可重用的 ent.Schema 代码片段,这些代码可以使用组合注入到其他模式中,因此,您可以在另一个模式中定义您的时间戳值,并将其混合到您需要的其他模式中,这样您的时间戳(基本实体)混合模式将如下所示

package schema

import (
    "entgo.io/ent"
    "entgo.io/ent/schema/field"
    "entgo.io/ent/schema/mixin"
    "time"
)

type TimeStamp struct {
    mixin.Schema
}

func (TimeStamp) Fields() []ent.Field {
    return []ent.Field{
        field.Time("created_at").Default(time.Now).Immutable(),
        field.Time("updated_at").Default(time.Now).UpdateDefault(time.Now),
    }
}

现在,当它被定义时,您需要将此时间戳模式注入到您的其他模式中。为此,您要做的就是将其注入该模式的 MixIn() 中,如下所示


func (User) Mixin() []ent.Mixin {
    return []ent.Mixin{
        TimeStamp{},
    }
}
......

func (Product) Mixin() []ent.Mixin {
    return []ent.Mixin{
        TimeStamp{},
    }
}

因此,您的最终模式将如下所示。


func (User) Mixin() []ent.Mixin {
    return []ent.Mixin{
        TimeStamp{},
    }
}

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("id"),
        field.String("name").MaxLen(70),
        field.String("email"),
    }
}

.....


func (Product) Mixin() []ent.Mixin {
    return []ent.Mixin{
        TimeStamp{},
    }
}

func (Product) Fields() []ent.Field {
    return []ent.Field{
        field.Int("id"),
        field.String("name").MaxLen(70),
        field.Float("price"),
    }
}

ent还提供了内置的时间混合,可用于将create_timeupdate_time字段添加到模式中,它被定义为mixin.Time{}.

有关更多详细信息,您可以查看Mixin

于 2021-08-29T21:11:21.073 回答