插件窝 干货文章 GORM关联查询:如何高效获取Table1关联的Table3所有数据?

GORM关联查询:如何高效获取Table1关联的Table3所有数据?

Table 关联 Preload Table3 436    来源:    2025-03-16

在使用GORM进行关联查询时,如果你需要高效地获取Table1关联的Table3的所有数据,通常可以通过预加载(Preload)来实现。假设Table1通过Table2Table3关联,以下是几种常见的场景和解决方案。

场景1:Table1 直接关联 Table3

如果Table1直接关联Table3,可以通过Preload直接加载Table3的数据。

type Table1 struct {
    ID    uint
    Name  string
    Table3 Table3 `gorm:"foreignKey:Table1ID"`
}

type Table3 struct {
    ID      uint
    Table1ID uint
    Data    string
}

var table1 Table1
db.Preload("Table3").First(&table1, 1)

场景2:Table1 通过 Table2 关联 Table3

如果Table1通过Table2Table3关联,可以通过嵌套的Preload来加载Table3的数据。

type Table1 struct {
    ID    uint
    Name  string
    Table2 Table2 `gorm:"foreignKey:Table1ID"`
}

type Table2 struct {
    ID      uint
    Table1ID uint
    Table3ID uint
    Table3   Table3 `gorm:"foreignKey:Table3ID"`
}

type Table3 struct {
    ID   uint
    Data string
}

var table1 Table1
db.Preload("Table2.Table3").First(&table1, 1)

场景3:Table1 通过 Table2 关联 Table3,且 Table2 是多对多关系

如果Table1Table3之间是多对多关系,并且通过Table2作为中间表,可以使用JoinsPreload结合的方式来加载数据。

type Table1 struct {
    ID    uint
    Name  string
    Table2 []Table2 `gorm:"many2many:table1_table2;"`
}

type Table2 struct {
    ID      uint
    Table3ID uint
    Table3   Table3 `gorm:"foreignKey:Table3ID"`
}

type Table3 struct {
    ID   uint
    Data string
}

var table1 Table1
db.Preload("Table2.Table3").First(&table1, 1)

场景4:使用Joins进行手动关联查询

如果你需要更复杂的查询条件,可以使用Joins手动进行关联查询。

var table3Data []Table3
db.Joins("JOIN table2 ON table2.table3_id = table3.id").
   Joins("JOIN table1 ON table1.id = table2.table1_id").
   Where("table1.id = ?", 1).
   Find(&table3Data)

总结

  • 直接关联:使用Preload直接加载关联表的数据。
  • 嵌套关联:使用嵌套的Preload来加载多层关联的数据。
  • 多对多关联:使用Preload结合many2many标签来加载多对多关联的数据。
  • 复杂查询:使用Joins手动进行关联查询,适用于需要复杂条件的场景。

通过合理使用PreloadJoins,可以高效地获取Table1关联的Table3的所有数据。