【问题标题】:How to create a Left Join in Jinzhu GORMJinzhu GORM中如何创建Left Join
【发布时间】:2018-04-16 04:30:35
【问题描述】:

我无法在 jinzhu GORM(MySQL 数据库)中创建带有左连接的简单查询

这些是我的结构:

type Prop struct {
    ID          uint   
    Status      Status 
    StatusID    uint
    Name        string 
}

type Status struct {
    ID   uint   
    Name string
}

Prop 有一个指向 Status 的外键

我要执行的 SQL 查询是:

SELECT * from prop LEFT JOIN status ON prop.status_id = status.id

所以我会从与状态表连接的道具表中检索所有记录

我试过了:

db.Find(&prop).Related(&status) 

但没有成功。有人有什么建议吗?提前致谢

【问题讨论】:

  • 这里是gorm的官方文档。 gorm.io/docs/query.html#Joins。希望对您有所帮助。
  • 嘿@MarufTuhin 我试过了。但是连接的表没有填充:var prop []model.Prop db.Table("prop").Select("*").Joins("left join status on prop.status_id = status.id").Scan(&prop) 结果是:[ {"id":1,"Status":{"id":0,"name":""},"StatusID":1,"name":"Proposal},{"id":2,"Status":{"id":0,"name":""},"StatusID":2,"name":"Proposal 2"} ] 如您所见,Status 对象返回空
  • 我刚在某处读到,表需要预加载。尝试在此处预加载 status 表。

标签: mysql go go-gorm


【解决方案1】:

嘿@arthur_mastropietro, 我认为预加载Prop 的相关Status 是关键。试试下面的:

prop := Prop{}
if err := db.Model(&prop).Preload("Status").Find(&prop).Error; err != nil {
  fmt.Println(err)
}
fmt.Printf("%+v\n", prop)

注意

您可以链接其他结构的预加载,即 Preload("Status").Preload("Something")...等等。事实上,您可以链接大多数 Gorm 函数调用。

此外,如果Status 也有另一个结构作为它的字段之一,您可以通过调用一次加载它们 Preload("Status.Something")

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2020-02-26
    • 2012-04-29
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多