比如两个表,user和post:
user hasMany post
post belongTo user
gen工具里面关系配置函数gen.FieldRelate,第三个table参数是个对象。
要生成双向关系变量会互相依赖,只能生成一方的。
怎么解?
比如两个表,user和post:
user hasMany post
post belongTo user
gen工具里面关系配置函数gen.FieldRelate,第三个table参数是个对象。
要生成双向关系变量会互相依赖,只能生成一方的。
怎么解?
// 解决方案:分文件定义模型关系避免循环依赖
// 文件 user_gen.go
func initUserModel(g *gen.Generator) {
user := g.GenerateModel("users",
gen.FieldRelate(gen.HasMany, "Posts",
gen.GeneratedModel("posts"), // 直接使用生成后的模型名称
&field.RelateConfig{
GORMTag: "foreignKey:UserID;references:ID",
}),
)
g.ApplyBasic(user)
}
// 文件 post_gen.go
func initPostModel(g *gen.Generator) {
post := g.GenerateModel("posts",
gen.FieldRelate(gen.BelongsTo, "User",
gen.GeneratedModel("users"),
&field.RelateConfig{
GORMTag: "foreignKey:UserID;references:ID",
}),
)
g.ApplyBasic(post)
}
// 关键点说明:
1. 分文件定义模型,避免Go的循环依赖
2. gen.GeneratedModel("table_name") 代替直接模型引用
3. 通过g.ApplyBasic分步应用模型定义
4. 确保外键关系配置一致:
- User表使用hasMany时配置foreignKey指向Post表的UserID
- Post表使用belongsTo时foreignKey保持相同UserID
5. 生成顺序无关,工具会自动处理依赖
// 生成命令:
// 在main.go中按顺序调用初始化函数
7 回答4.9k 阅读
6 回答6.7k 阅读✓ 已解决
1 回答5.9k 阅读✓ 已解决
2 回答3.5k 阅读✓ 已解决
1 回答5.5k 阅读✓ 已解决
4 回答1.9k 阅读
1 回答1.8k 阅读✓ 已解决