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,加上配置就行了

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

我实测是可以的

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:

2022/04/15 09:49:18 E:/GoProject/nine/app/repositorie/user_repositorie.go:60
[2.150ms] [rows:1] SELECT `tz_asset`.`id`,`tz_asset`.`created_at`,`tz_asset`.`updated_at`,`tz_asset`.`deleted_at`,`tz_asset`.`name`,`tz_asset`.`file`,`tz_asset`.`extension` FROM `tz_asset` WHERE `tz_asset`.`id` = 1 AND `tz_as
set`.`deleted_at` IS NULL

2022/04/15 09:49:18 E:/GoProject/nine/app/repositorie/user_repositorie.go:60
[5.056ms] [rows:1] SELECT `tz_user_icon`.`id`,`tz_user_icon`.`created_at`,`tz_user_icon`.`updated_at`,`tz_user_icon`.`deleted_at`,`tz_user_icon`.`user_id`,`tz_user_icon`.`asset_id`,`tz_user_icon`.`is_activity` FROM `tz_user_i
con` WHERE `tz_user_icon`.`user_id` = 1 AND `tz_user_icon`.`deleted_at` IS NULL

2022/04/15 09:49:18 E:/GoProject/nine/app/repositorie/user_repositorie.go:60
[9.325ms] [rows:1] SELECT `tz_user`.`id`,`tz_user`.`email`,`tz_user`.`nickname`,`tz_user`.`profile` FROM `tz_user` WHERE `tz_user`.`id` = 1 ORDER BY `tz_user`.`id` LIMIT 1
{
    "id": 1,
    "email": "937681139@qq.com",
    "nickname": "任小兔",
    "profile": "",
    "icons": [
        {
            "id": 1,
            "created_at": "2022-04-15 09:46:36",
            "updated_at": "2022-04-15 09:46:38",
            "deleted_at": null,
            "user_id": 1,
            "asset_id": 1,
            "is_activity": 1,
            "asset": {
                "id": 1,
                "created_at": "2022-04-15 09:46:29",
                "updated_at": "2022-04-15 09:46:32",
                "deleted_at": null,
                "name": "test",
                "file": "01",
                "extension": "txt"
            },
            "user_info": null
        }
    ]
}

2022/04/15 09:49:18 E:/GoProject/nine/app/repositorie/user_repositorie.go:69
[2.156ms] [rows:1] SELECT `tz_user`.`id`,`tz_user`.`email`,`tz_user`.`nickname`,`tz_user`.`profile` FROM `tz_user` WHERE `tz_user`.`id` = 1

2022/04/15 09:49:18 E:/GoProject/nine/app/repositorie/user_repositorie.go:69
[4.969ms] [rows:1] SELECT `tz_user_icon`.`id`,`tz_user_icon`.`created_at`,`tz_user_icon`.`updated_at`,`tz_user_icon`.`deleted_at`,`tz_user_icon`.`user_id`,`tz_user_icon`.`asset_id`,`tz_user_icon`.`is_activity` FROM `tz_user_i
con` WHERE `tz_user_icon`.`user_id` = 1 AND `tz_user_icon`.`deleted_at` IS NULL ORDER BY `tz_user_icon`.`id` LIMIT 1
{
    "id": 1,
    "created_at": "2022-04-15 09:46:36",
    "updated_at": "2022-04-15 09:46:38",
    "deleted_at": null,
    "user_id": 1,
    "asset_id": 1,
    "is_activity": 1,
    "asset": {
        "id": 0,
        "created_at": null,
        "updated_at": null,
        "deleted_at": null,
        "name": "",
        "file": "",
        "extension": ""
    },
    "user_info": {
        "id": 1,
        "email": "937681139@qq.com",
        "nickname": "任小兔",
        "profile": "",
        "icons": null
    }
}
2年前 评论
hodor111 1年前
renxiaotu (作者) 1年前
hodor111 1年前
renxiaotu (作者) 1年前
hodor111 1年前

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

11个月前 评论
renxiaotu 10个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!