在 Gorm 中设置外键可以通过定义模型之间的关系来实现。具体步骤如下:
- 定义主表和从表的模型
type Product struct {
ID uint `gorm:"primary_key"`
Name string
}
type Order struct {
ID uint `gorm:"primary_key"`
ProductID uint
Quantity int
}
- 在从表模型中定义外键
func (o *Order) TableName() string {
return "orders"
}
func (o *Order) BeforeCreate(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterCreate(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
func (o *Order) BeforeSave(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterSave(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
func (o *Order) BeforeUpdate(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterUpdate(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
func (o *Order) BeforeDelete(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterDelete(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
- 定义从表模型的关系
func (o *Order) BeforeSave(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterSave(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
func (o *Order) BeforeUpdate(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterUpdate(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
func (o *Order) BeforeDelete(scope *gorm.DB) error {
scope.SetColumn("product_id", o.ProductID)
return nil
}
func (o *Order) AfterDelete(scope *gorm.DB) error {
err := scope.Model(o).UpdateColumn("product_id", o.ProductID).Error
return err
}
- 进行数据库迁移
db.AutoMigrate(&Product{}, &Order{})
上述代码定义了一个主表 Product 和一个从表 Order,从表 Order 中有一个外键 ProductID 关联到主表 Product 的 ID 字段。在从表 Order 模型中,通过 BeforeCreate、AfterCreate、BeforeSave、AfterSave、BeforeUpdate、AfterUpdate、BeforeDelete、AfterDelete 方法设置外键的值以保证数据的一致性。最后通过 db.AutoMigrate() 函数将模型映射到数据库中进行迁移。




