edge: multiple storage-keys defined for edge on O2M same type 解决方法

文章讲述了如何在Go-Onchain项目中使用entgo库定义subject目录表,包括parent_id字段的关联,以及如何在Subject和SubjectDetail表之间建立父子关系和详细信息的存储方式。
摘要由CSDN通过智能技术生成

需求:需要在subject目录表中,关联一个父级目录ID(parent_id),需要自定义生成ID的字段名

  • 需要在 subjectFields() 函数中定义parent_id字段
  • subjectEdges() 函数中关联父级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官网问题地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值