GORM关联查询使用请教

1. 运行环境#

[版本]: go version go1.18 windows/amd64

2. 问题描述?#

Go 语言使用 GORM:

type Article struct {
    ArticleScore  ArticleScore  `json:"article_score"`
}
type ArticleScore struct {
}
global.GlobalDb.Where("id = ?", id).Preload("ArticleScore").First(&art)

通过查询 article 表能 preload 出 articlescore 表相关的数据,反过来查 articlescore 表出不来 article 表的数据,请问反过来的话得怎么使用呀,请大神指点,谢谢

讨论数量: 10

因为你只在 Article 结构体里配置了 ArticleScore, 没有在 ArticleScore 结构体里配置 Article,加上配置就行了

3年前 评论
Losunlee (楼主) 3年前

我实测是可以的

model:

type UserInfo struct {
    ID       uint       `json:"id" msgpack:"id" gorm:"primary_key"`
    Email    string     `json:"email" msgpack:"email" gorm:"unique" `
    Nickname string     `json:"nickname" msgpack:"nickname" gorm:"unique" `
    Profile  string     `json:"profile" msgpack:"profile"`
    Icons    []UserIcon `json:"icons" msgpack:"icons" gorm:"foreignKey:user_id;localKey:id;comment:头像列表"`
}

func (u UserInfo) TableName() string {
    return "tz_user"
}

type UserIcon struct {
    BaseModel
    UserId     uint      `json:"user_id" msgpack:"user_id" gorm:"comment:用户id"`         //用户
    AssetId    uint      `json:"asset_id" msgpack:"asset_id" gorm:"comment:资源id"`       //资源
    IsActivity int8      `json:"is_activity" msgpack:"is_activity" gorm:"comment:是否启用"` //激活状态,1为当前使用中的头像
    Asset      Asset     `json:"asset" msgpack:"asset" gorm:"foreignKey:id;localKey:asset_id;comment:关联资源"`
    UserInfo   *UserInfo `json:"user_info" msgpack:"user_info" gorm:"foreignKey:user_id;localKey:id;comment:用户信息"`
}

repositorie:

// GetInfo 获取用户信息
func (r *userRepository) GetInfo(userId uint) (*models.UserInfo, error) {
    var ui models.UserInfo
    err := db.Preload("Icons").Preload("Icons.Asset").Where(&models.User{
        BaseModel: models.BaseModel{
            ID: userId,
        },
    }).First(&ui).Error
    return &ui, err
}

// GetIcons 获取用户头像
func (r *userRepository) GetIcons(userId uint) (*models.UserIcon, error) {
    var ui models.UserIcon
    err := db.Model(&ui).Preload("UserInfo").Where(&models.UserIcon{
        UserId: userId,
    }).First(&ui).Error
    return &ui, err
}

run:

ui, err := repositorie.UserRepository.GetInfo(1)
    if err != nil {
        panic(err)
    }
    utils.Println(ui)

    icons, _ := repositorie.UserRepository.GetIcons(1)
    if err != nil {
        panic(err)
    }
    utils.Println(icons)

print:

代码已被折叠,点此展开
3年前 评论
hodor111 2年前
renxiaotu (作者) 2年前
hodor111 2年前
renxiaotu (作者) 2年前
hodor111 2年前

@renxiaotu Preload 中的查询条件不能影响整体结果,如果主表有数据 子表没数据,就不被查出来,现在查完了如果没数据是 只有关联字段是空的 这怎么处理呢

1年前 评论
renxiaotu 1年前