在go ent框架中创建基础实体
Create base entity in go ent framework
我是 golang 新手,正在使用 ent 框架作为 ORM。
每个模式都应该有字段 created_at
和 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
来做到这一点,但不确定在这种情况下该怎么做。
您可以使用 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_time
和 update_time
字段添加到架构中,它被定义为 mixin.Time{}
。
有关详细信息,您可以查看 Mixin
我是 golang 新手,正在使用 ent 框架作为 ORM。
每个模式都应该有字段 created_at
和 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
来做到这一点,但不确定在这种情况下该怎么做。
您可以使用 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_time
和 update_time
字段添加到架构中,它被定义为 mixin.Time{}
。
有关详细信息,您可以查看 Mixin