GORM:如何将 FK 从孩子指向父母?

问题描述 投票:0回答:1

这是场景:问题和答案。一个问题可以没有答案,但(显然)答案必须指向一个问题。我希望能够提出问题并反对回答。基本的东西,但我不知道如何在 GORM 中实现它。

我有两个结构:

type Question struct {
  Tenancy string `gorm:"primaryKey;autoIncrement:false"`
  ID      string `gorm:"primaryKey;autoIncrement:false"`
  Text    string
  ...
}

type Answer struct {
  Tenancy string `gorm:"primaryKey;autoIncrement:false"`
  ID      string `gorm:"primaryKey;autoIncrement:false"`
  Text    string
  ...
}

我想实现这样的目标:

type Question struct {
  Tenancy string
  ID      string
  Text    string
  Answer  *Answer // Optional answer - left join
  ...
}

type Answer struct {
  Tenancy string
  ID      string
  Text    string
  ...
}

我在问题和答案上都有复合主键,理想情况下我想要两者之间的外键约束,即

(tenancy, id) references questions(tenancy, id)
然后能够执行类似

db.Joins("Answer").First(&question)

如有必要,我可以在

QuestionID
上添加一个额外的
Answer
字段,但我仍然无法弄清楚如何正确设置 FK。例如这个作品:

type Question struct {
  Tenancy string
  ID      string
  Text    string
  ...
}

type Answer struct {
  Tenancy    string
  ID         string
  QuestionID string   `gorm:"not null;default:null"`
  Question   Question `gorm:"foreignKey:Tenancy,QuestionID;references:Tenancy,ID"`
  Text       string
  ...
}

这允许我获取带问题的答案,但我希望反过来,带(可为空)答案的问题。

如果我尝试在

Answer
上添加一个
Question
字段,迁移就会失败:

为结构问题的字段找到无效字段答案:为关系定义有效的外键或实现 Valuer/Scanner 接口

有什么想法吗?

go go-gorm
1个回答
0
投票

似乎我把事情复杂化了:

type Question struct {
  Tenancy string  `gorm:"primaryKey;autoIncrement:false"`
  ID      string  `gorm:"primaryKey;autoIncrement:false"`
  Text    string  `gorm:"not null;default:null"`
  Answer  *Answer `gorm:"foreignKey:Tenancy,ID;references:Tenancy,ID"`
  ...
}

type Answer struct {
  Tenancy  string  `gorm:"primaryKey;autoIncrement:false"`
  ID       string  `gorm:"primaryKey;autoIncrement:false"`
  Text     string  `gorm:"not null;default:null"`
  ...
}

生成正确的外键

© www.soinside.com 2019 - 2024. All rights reserved.