# #go #orm #ent
Вопрос:
Я новичок в golang и использую ent framework в качестве 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),
}
}
Я пришел из ООП лагнагеус, где я могу сделать это с помощью чего-то такого BaseEntity
, что все остальные сущности наследуют от него, но не знаю, как это сделать в данном случае.
Ответ №1:
Вы можете использовать миксин , которая позволяет создавать многократно используемые фрагменты ЛОР.Код схемы, который может быть введен в других схем, используя композицию Так, вы можете определить свои значения timestamp в другой схеме и просто смешать его в других схемах, где вам нужно, чтобы ваши метки(базовая организация) миксина схема будет выглядеть следующим образом
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