为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
弑天下 2023-08-14 16:37:04
我无法理解这个函数的作用。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用来缓存结果的吗?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您提供的链接显示了它的作用。您只需要实际阅读页面上的信息即可。


首先,这并没有真正做任何事情:


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)

只需上面的代码,您现在就可以访问数据库中不同表中的用户数据。


我希望这有帮助。



查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信