gorm 中的 Preload 功能是做什么的?
What does Preload function do in gorm?
link 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
是用来缓存结果的?
您提供的 link 显示了它的作用。您只需要实际阅读页面上的信息即可。
首先,这并没有真正做任何事情:
db.Preload("Username")
另一方面,以下内容:
db.Preload("Orders").Find(&users)
确实有所作为。首先填充 users
,然后填充 []user.Orders
。在您 link 编辑的页面的评论中,您会发现这个,它通过查询显示了它的作用:
db.Preload("Orders").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
那么这到底有什么作用呢?我可以给你技术上的答案,你可以通过谷歌搜索 eager loading 轻松找到,或者我可以通过示例给你一个我觉得更简单的答案。
让我举例说明一下。
假设你有用户,每个用户可以有多个订单。这是一个一对多的关系,可以这样定义:
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)
只需使用上面的代码,您现在就可以访问数据库中不同表中的用户数据。
希望对您有所帮助。
link 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
是用来缓存结果的?
您提供的 link 显示了它的作用。您只需要实际阅读页面上的信息即可。
首先,这并没有真正做任何事情:
db.Preload("Username")
另一方面,以下内容:
db.Preload("Orders").Find(&users)
确实有所作为。首先填充 users
,然后填充 []user.Orders
。在您 link 编辑的页面的评论中,您会发现这个,它通过查询显示了它的作用:
db.Preload("Orders").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
那么这到底有什么作用呢?我可以给你技术上的答案,你可以通过谷歌搜索 eager loading 轻松找到,或者我可以通过示例给你一个我觉得更简单的答案。
让我举例说明一下。
假设你有用户,每个用户可以有多个订单。这是一个一对多的关系,可以这样定义:
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)
只需使用上面的代码,您现在就可以访问数据库中不同表中的用户数据。
希望对您有所帮助。