Создайте базовую сущность в go ent framework

# #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