gpt4 book ai didi

go - 是否可以使 GORM 中的 db.Preload() 成为自动预加载?

转载 作者:行者123 更新时间:2023-12-04 11:54:00 57 4
gpt4 key购买 nike

模型.go:


type First struct {
ID int `json:"id" gorm:"column:id;primary_key"`
Status string `json:"status" gorm:"column:status"`
SecondID int `json:"second_id" gorm:"column:second_id"`
SecondData Second `json:"second_data" gorm:"foreignKey:SecondID;references:ID"`
}

type Second struct {
ID int `json:"id" gorm:"column:second_id;primary_key"`
Status string `json:"status" gorm:"column:status"`
Description string `json:"description" gorm:"column:description"`
}

var res []model.First

db.Raw("first.*, second.* FROM first LEFT JOIN second ON first.second_id = second.second_id")
db.Preload("SecondData").Find(&res).Error

输出:
{
"id": 1,
"status": "A",
"second_id": 1
"second_data": {
"id": 1
"status": "B",
"description": "blablabla"
}
}

我真的不知道 db.Preload() 是如何工作的。为什么每次我需要做嵌套结构时我都应该使用 db.Preload() 来获取“SecondData”?是否可以只使用 db.Row() 或 db.Table().Joins().Where().Find(),我的意思是没有 db.Preload()?

最佳答案

如果你想要 SecondData每次加载时First不使用 Preload 加载结构体,你可以考虑使用 hooks .
它可能看起来像这样:

func (f *First) AfterFind(tx *gorm.DB) error {
return tx.First(&f.SecondData, f.SecondID).Error
}
因此,当您加载 First 时数据, AfterFind钩子(Hook)应该被触发。

关于go - 是否可以使 GORM 中的 db.Preload() 成为自动预加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67205941/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com