这是场景:问题和答案。一个问题可以没有答案,但(显然)答案必须指向一个问题。我希望能够提出问题并反对回答。基本的东西,但我不知道如何在 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 接口
有什么想法吗?
似乎我把事情复杂化了:
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"`
...
}
生成正确的外键