需求:需要在subject目录表中,关联一个父级目录ID(parent_id),需要自定义生成ID的字段名
- 需要在 subject 的 Fields() 函数中定义parent_id字段
- 在 subject 的 Edges() 函数中关联父级ID时,指定Fields()的parent_id字段
- 在定义目录详细表SubjectDetail时,如果需要指定关联的Subject主键,可以使用StorageKey,但是在关联自身表的父级主键时,不能使用StorageKey方法
完整代码如下:
subject.go
package schema
import (
"go-onchain/pkg/util/schema"
"entgo.io/ent"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
type Subject struct {
ent.Schema
}
func (Subject) Mixin() []ent.Mixin {
return []ent.Mixin{
schema.TimeMixin{},
}
}
func (Subject) Fields() []ent.Field {
return []ent.Field{
field.String("name").Comment("目录名称"),
field.Int("parent_id").Optional().Comment("父级目录ID"),
}
}
// Edges of the Subject.
func (Subject) Edges() []ent.Edge {
return []ent.Edge{
edge.To("children", Subject.Type).
From("parent").
Field("parent_id").
Unique().
Comment("父级目录ID"),
edge.To("subject_detail", SubjectDetail.Type).StorageKey(edge.Column("subject_id")).Comment("目录关联的详细信息"),
}
}
subject_detail.go
package schema
import (
"go-onchain/pkg/util/schema"
"entgo.io/ent"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
type SubjectDetail struct {
ent.Schema
}
func (SubjectDetail) Mixin() []ent.Mixin {
return []ent.Mixin{
schema.TimeMixin{},
}
}
// Fields of the SubjectDetail.
func (SubjectDetail) Fields() []ent.Field {
return []ent.Field{
field.String("detail_name").Comment("详细名称"),
field.Bool("is_deleted").Comment("是否删除"),
}
}
// Edges of the SubjectDetail.
func (SubjectDetail) Edges() []ent.Edge {
return []ent.Edge{
edge.From("subject", Subject.Type).Required().Unique().Ref("subject_detail").Comment("所属目录"),
}
}
func (SubjectDetail) Indexes() []ent.Index {
return []ent.Index{}
}
附上 github官网问题地址