sql - 通过外键联合查询

标签 sql go go-gorm

我有以下两个模型:FileSession,一个 session 可以有很多 File 对象(一对多)。

type Session struct {
    gorm.Model
    Name            string       `json:"name,omitempty"`    
    IsCurrent       bool         `json:"is_current"`
    Files     []File `gorm:"foreignkey:SessionID" json:"files"`
}

type File struct {
    gorm.Model
    Name        string `json:"name"`
    FileType    string `json:"file_type"`
    ParentName  string `json:"parent_name"`
    SessionID   uint   `json:"session_id"`
}

我想获取与具有 IsCurrent = true

的 session 关联的所有文件

我编写了以下看起来工作正常的原始 SQL 查询,但我想知道是否有任何方法可以执行类似的查询 int he Gorm方式。

err = db.Raw("SELECT * FROM files, sessions WHERE files.session_id == sessions.id AND sessions.is_current = ?", true).Scan(&fileObjects).Error

最佳答案

@TonyGW 关键是在你的 Gorm 调用中使用 PreloadWhere 的组合。

currentSession := &Session{}

err := db.Model(&Session{}).Preload("Files").Where(&Session{IsCurrent: true}).Find(&currentSession).Error
if err != nil {
  fmt.Println("Error:", err)
}

fmt.Printf("%+v\n", currentSession)

仅供引用

您可以通过多种方式构造Where 查询。例如,

db.Model(&Session{}).Preload("Files").Where("is_current = ?", true).Find(&currentSession)

并且还使用 map 构建多个 Where 条件,

db.Model(&Session{}).Preload("Files").Where(map[string]interface{}{
  "is_current": true,
  "something_else": "value",
}).Find(&currentSession)

希望对您有所帮助!

关于sql - 通过外键联合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828714/

相关文章:

SQL查询以在给定条件下明确获取总和

MySQL 存储过程错误 - 从参数名称创建表

go - 除非达到 EOF,否则哪个接口(interface)确保读取固定数量的字节?

dictionary - 如何在 Go 中获取变量的内存大小?

SQL 每月销售额前 10 名

go - 如何反转字符串中每个字母的大小写?

postgresql - 我正在尝试通过电子邮件查找记录

database - 在 go http 的自定义处理程序中传递 *gorm.db 实例的最佳实践

postgresql - 分隔查询位置

php - 我的社交网络中的用户无法注册和登录