首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖gorm中的外键和引用

覆盖gorm中的外键和引用
EN

Stack Overflow用户
提问于 2021-02-15 05:32:32
回答 2查看 636关注 0票数 0

我定义了两个DB结构

代码语言:javascript
复制
type Main struct {
    gorm.Model
    GroupID   int64  `gorm:"column:group_id"`
    GroupName string `gorm:"column:group_name"`
    ItemID    string `gorm:"column:item_id"`
    Item      Item   `gorm:"foreignKey:ItemID;references:item_id"`
}

type Item struct {
    gorm.Model
    ItemID   string `gorm:"column:item_id"`
    ItemName string `gorm:"column"item_name"`
}

但是,当我做一个选择时,即

代码语言:javascript
复制
mains := make([]*Main, 0)
db.Where(someFilters).Preload("Item").Find(&mains)

我收到问询

代码语言:javascript
复制
SELECT * FROM mains WHERE condition1='condition_value';
SELECT * FROM items WHERE item_id IN (1, 2); # Uses Main's ID field as the argument instead

IN查询使用Main结构的主键item_id,而不是使用字段item_id。我在这里做错什么了吗?我只想通过item_id获得“连接”结果,也就是说,我希望第二个查询是

代码语言:javascript
复制
SELECT * FROM items WHERE item_id IN (`main_1_item_id`, `main_2_item_id`);

更新:还尝试将标记更改为association_foreign_key

代码语言:javascript
复制
type Main struct {
    gorm.Model
    GroupID   int64  `gorm:"column:group_id"`
    GroupName string `gorm:"column:group_name"`
    ItemID    string `gorm:"column:item_id"`
    Item      Item   `gorm:"association_foreignkey:ItemID;references:item_id"`
}

现在生成的SQL是

代码语言:javascript
复制
SELECT * FROM mains WHERE condition1='condition_value';
SELECT * FROM items WHERE id IN (`main_1_item_id`, `main_2_item_id`); # Uses Main's ItemID field but using Item's ID field as query

参考资料:

1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-15 06:49:44

我已经找到了解决问题的办法。

gorm标记应该是

代码语言:javascript
复制
type Main struct {
    gorm.Model
    GroupID   int64  `gorm:"column:group_id"`
    GroupName string `gorm:"column:group_name"`
    ItemID    string `gorm:"column:item_id"`
    Item      Item   `gorm:"associationForeignKey:ItemID;foreignKey:ItemID"`
}

type Item struct {
    gorm.Model
    ItemID   string `gorm:"column:item_id"`
    ItemName string `gorm:"column"item_name"`
}

现在生成的SQL查询是

代码语言:javascript
复制
SELECT * FROM mains WHERE condition1='condition_value';
SELECT * FROM items WHERE item_id IN (`main_1_item_id`, `main_2_item_id`);
票数 3
EN

Stack Overflow用户

发布于 2021-02-15 06:42:23

我有几个想法你可能想研究一下:

第一:既然在Item结构中有一个Main结构,为什么要为ItemID使用第二个字段,那么项结构中已经有一个字段了。Gorm非常擅长自动处理关联,只需将Item结构嵌入到Main结构中即可。

第二:当嵌入gorm.Model时,它将其Id字段声明为结构的主键,这也可能导致问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66203163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档