Mysql 表引用了一个表,而该表又引用了另一个表

Mysql 表引用了一个表,而该表又引用了另一个表,mysql,go,go-gorm,Mysql,Go,Go Gorm,我使用的是gorm,我有这样一个结构,用户表包含一个外键,引用地址,然后引用国家 类型用户结构{ ID int`gorm:“列:ID;primaryKey;自动递增”json:“ID”` 地址 AddressID int`gorm:“列:address\u id;foreignKey:AddressID;引用:id”json:“address”` } 类型地址结构{ ID int`gorm:“列:ID;primaryKey;自动增量;”json:“ID”` CountryCode int`gor

我使用的是gorm,我有这样一个结构,
用户
表包含一个外键,引用
地址
,然后引用
国家

类型用户结构{
ID int`gorm:“列:ID;primaryKey;自动递增”json:“ID”`
地址
AddressID int`gorm:“列:address\u id;foreignKey:AddressID;引用:id”json:“address”`
}
类型地址结构{
ID int`gorm:“列:ID;primaryKey;自动增量;”json:“ID”`
CountryCode int`gorm:“列:国家代码;外键:国家代码;引用:代码”json:“国家代码”`
乡村
}
类型国家结构{
Code int`gorm:“列:Code;primaryKey;自动增量”json:“Code”`
名称字符串`gorm:“列:名称”json:“名称”`
大陆名称字符串`gorm:“列:大陆名称”json:“大陆名称”`
}
照片中解释的关系:

现在,当我使用以下命令返回用户时:

db.Model(&user).Where().First()//或Find()
我得到了地址,国家是空的,就像这样:

{
ID:1,
地址:2,,
地址:{
//空地址。
}
}
我确实为自己创建了重新填充
地址
国家
记录的函数,类似如下:


func PopulateUser(用户)用户{
addr=findaddresbyd(user.ID)
cntr=FindCountryCode(地址代码)
地址国家=cntr
user.Address=addr
返回用户
}
但我的问题是:

  • Gorm
    中是否有一个函数可以在我不创建函数的情况下为我实现这一点
  • 在这种情况下,协会能提供帮助吗
  • 如果我希望在用户删除时删除地址,我如何在
    Gorm
    中执行此操作
  • 我试图自己找到答案,但文档有点凌乱。

    显示了要在结构引用中使用的外键标记。 i、 e在您的情况下,这些应该在地址和国家,而不是地址ID和国家代码。比如:

    类型用户结构{
    地址`gorm:“foreignKey:AddressID;references:ID”`
    AddressID int`gorm:“列:地址\u id”`
    }
    类型地址结构{
    CountryCode int`gorm:“列:国家代码”`
    国家/地区gorm:“外键:国家代码;参考:代码”`
    }
    
    请试试这些

    为了

  • 请看急装
  • db.Preload(“用户”).Preload(“地址”).Find(&users)
    
  • 可以在列上使用标记
  • 类型用户结构{
    戈姆模型
    名称字符串
    公司ID int
    Company`gorm:“约束:OnUpdate:CASCADE,OnDelete:SET NULL;”`
    }