GORM Preload 和 Joins 联合使用:指定表关联的最佳实践
假设我们有两个表:'users' 和 'posts',每个用户可以发表多篇文章,我们想要查询所有用户以及他们的所有文章。我们可以使用 'joins' 和 'preload' 结合使用来实现这个目标。
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
Posts []Post `gorm:"foreignKey:UserID;references:ID"`
}
type Post struct {
ID uint
Title string
Content string
UserID uint
}
func main() {
db, err := gorm.Open(mysql.Open("dsn"), &gorm.Config{})
if err != nil {
panic(err)
}
var users []User
if err := db.Preload("Posts").Find(&users).Error; err != nil {
panic(err)
}
fmt.Println(users)
}
在上面的代码中,我们使用 'Preload' 预加载了 'Posts' 关联数据,并在 'User' 结构体中使用 gorm:"foreignKey:UserID;references:ID" 注解指定了 Posts 和 User 的关联关系。这样,我们就能够查询到所有用户以及他们的所有文章了。
在 'Joins' 中,我们可以使用任何有效的 SQL 语句来指定关联条件,例如:
db.Joins("LEFT JOIN posts ON users.id = posts.user_id AND posts.published = true")
这样就可以只查询已发布的文章了。
总结:
- 使用 'Preload' 可以预加载关联数据,提高查询效率。
- 使用 'Joins' 可以指定更复杂的关联条件,满足更灵活的查询需求。
- 在 'Joins' 中,可以使用任何有效的 SQL 语句来指定关联条件。
- 使用 'gorm:"foreignKey:UserID;references:ID"` 注解可以更方便地指定表关联关系。
原文地址: https://www.cveoy.top/t/topic/mQqr 著作权归作者所有。请勿转载和采集!