【发布时间】:2021-07-02 00:34:16
【问题描述】:
我想创建一个 Booking-Class 关系,每个 Booking 只能分配一个 Class。
type Class struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Booking struct {
Id int `json:"id"`
User string `json:"user"`
Members int `json:"members"`
ClassId int `json:"classid"`
}
我知道它类似于 gorm 的“属于”关系在这里解释 https://gorm.io/docs/belongs_to.html 但我想知道是否可以在不定义 Booking 模型中的 Class 类型字段的情况下实现“外键约束”(仅 ClassId诠释)。为了确保使用不存在的 ClassId-s,我定义了函数:
func Find(slice []int, val int) bool {
for _, item := range slice {
if item == val {
return true
}
}
return false
}
func GetClassKeys(d *gorm.DB) []int {
var keys []int
rows, _ := d.Raw(`SELECT id
FROM classes`).Rows()
defer rows.Close()
for rows.Next() {
var key int
rows.Scan(&key)
keys = append(keys, key)
}
return keys
}
并在创建/更新预订之前执行此检查:
if !Find(GetClassKeys(db), booking.ClassId) {
log.Println("Wrong class id value")
return
}
但这不能处理删除类 id 的情况(常规数据库会自动执行)。我想知道有没有办法通过简单地在用户模型中引用 Class 的主键来使用 gorm 实现正常的数据库外键功能?提前致谢
【问题讨论】:
-
department来自哪里?顶部的两个结构中没有提到它? -
@Christian 抱歉打错了,我的意思是班级。编辑了帖子。谢谢!
-
您应该能够使用迁移器界面手动添加约束:gorm.io/docs/migration.html#Constraints(注意:我没有成功地做到这一点,因为文档有点稀疏)
标签: go foreign-keys go-gorm