假设我们有两个表:'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" 注解指定了 PostsUser 的关联关系。这样,我们就能够查询到所有用户以及他们的所有文章了。

在 '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"` 注解可以更方便地指定表关联关系。
GORM Preload 和 Joins 联合使用:指定表关联的最佳实践

原文地址: https://www.cveoy.top/t/topic/mQqr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录