gorm中的Preload函数有什么作用?

链接http://gorm.io/docs/preload.html谈到了 GORM 中的预加载,但我无法理解这个函数的作用。


type User struct {

  gorm.Model

  Username string

  Orders Order

}

type Order struct {

  gorm.Model

  UserID uint

  Price float64

}



db.Preload("Username")


db.Preload("Orders").Find(&users)


有人可以解释这两个语句会做什么吗?输出会是什么?


是preload用来缓存结果的吗?


慕姐4208626
浏览 598回答 1
1回答

江户川乱折腾

您提供的链接显示了它的作用。您只需要实际阅读页面上的信息。首先,这并没有真正做任何事情:db.Preload("Username")另一方面,以下内容:db.Preload("Orders").Find(&users)做某事。首先它填充users然后它填充[]user.Orders。在您链接的页面上的评论中,您会发现这一点,它通过查询显示了它的作用:db.Preload("Orders").Find(&users)//// SELECT * FROM users;//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);那么这到底有什么作用呢?我可以给你技术答案,你可以通过谷歌搜索快速加载很容易找到,或者我可以通过例子给你一个我觉得更简单的答案。因此,让我通过示例来解释这一点。假设您有用户,每个用户可以有多个订单。这是一对多的关系,可以定义为:type User struct {  gorm.Model  Username string  Orders []Order}当您users像这样填充切片时:db.Find(&users)//// SELECT * FROM users;如果您需要获取每个用户的所有订单,您可以轻松访问user.Orders,但这无论如何都是空的,因为它没有被填充。如果我们users像这样填充切片:db.Preload("Orders").Find(&users)user.Orders将由该用户的订单填充。这是一种使处理关系更容易的抽象。丑陋的选择是:db.Find(&users)for user := range users {  db.Where("user_id", user.id).Find(&user.Orders)}它还会向数据库发出不必要的请求。(这不好)如果您的用户有帖子、评论和订单,那么您可以像这样定义和查询它:type User struct {  gorm.Model  Username string  Orders []Order  Comments []Comment  Posts []Post}db.Preload("Orders").Preload("Comments").Preload("Posts").Find(&users)只需上面的代码,您现在就可以访问数据库中不同表中的用户数据。我希望这会有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go