[英]GoLang GORM Cyclical Binary Tree
我正在尝试使用 GORM(gorm.io/gorm v1.21.9)在 GoLang(go 1.16)中 model 数据库。
我的架构的一部分包括带有 2 个可选外键的表 A,实际上每条记录只使用 1 个。 表 B 包含对表 A 的 2 个引用,例如二叉树。 表 C 是叶节点。
我设置了如下所示的 GORM 代码。
type A struct {
ID string
BID *string
B *B
CID *string
C *C
}
type B struct {
ID string
LeftAID string
LeftA A
RightAID string
RightA A
}
type C struct {
ID string
}
当我使用示例数据加载应用程序时,表 B 的外键始终具有 null 值。
但是,表 A 对每条记录都有一个 table_b_id 值(当 table_c_id 存在时,应该是 null)。
我猜想,由于表 A 具有表 B 的外键,因此它在所有情况下都使用该关联,而不是选择 right_a_id 和 left_a_id 关联。 是否有可以解决此问题的 GORM 注释,或者这是 GORM 固有的限制?
请注意,我已经删除了不相关的架构信息并使用了抽象的表/列名。
也许你应该使用Self-Referential Has One
自我参照有一个像follow
type A struct {
ID string
LeftID *string
LeftA *A `gorm:"foreignkey:LeftID"`
RightID *string
RightA *A `gorm:"foreignkey:RightID"`
LeafID *string
LeafA *A `gorm:"foreignkey:LeafID"`
}
测试代码:
func main() {
db := config.CreateMysql()
db.AutoMigrate(&A{})
a1 := A{ID: "a1"}
a2 := A{ID: "a2"}
a3 := A{ID: "a3"}
a4 := A{ID: "a4"}
a5 := A{ID: "a5"}
a1.LeftA = &a2
a1.RightA = &a3
a4.LeafA = &a5
db.Create(&a1)
db.Create(&a4)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.