在 GORM for Go 中,可以定义模型之间的关系,例如城镇和地点之间的关系。查询地点时,通常还需要检索关联的城镇信息。
考虑以下代表城镇和地点的结构:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
带有一个简单的数据库包含两个城镇和与其中一个城镇相关的两个地点,查询所有地点可能不会产生预期的结果。您可能会收到一系列具有空城镇字段的地点,而不是检索地点及其关联的城镇信息。
要正确查询地点及其关联的城镇信息,TownID 必须被指定为 Place 结构体中的外键:
type Place struct { ID int Name string TownID int Town Town }
可以采取多种方法来处理查询:
方法1:使用Related()方法
places := []Place{} db.Find(&places) for i, _ := range places { db.Model(places[i]).Related(&places[i].Town) }
此方法会触发对每个地点的额外查询以检索关联的城镇,从而产生n 1 个问题。
方法 2: 使用预加载
首选方法是使用预加载,这样可以有效查询关联模型。
db.Preload("Town").Find(&places)
此方法仅触发两个查询:一个检索所有位置,一个检索所有位置关联的城镇。
通过使用这种方法,查询将返回预期的结果,其中每个地点对象都包含关联的城镇信息。
以上是如何在 Go 中使用 GORM 高效查询地点及其相关城镇?的详细内容。更多信息请关注PHP中文网其他相关文章!