gorm中多对多自定义中间表,并且在查询的时候将自定义中间表的字段一起查询出来
时间: 2024-02-18 20:02:18 浏览: 34
在GORM中,可以使用`AssociationMode`方法和`Preload`方法来自定义中间表,并且在查询的时候将自定义中间表的字段一起查询出来。以下是一个示例:
```go
type User struct {
gorm.Model
Name string
Emails []Email `gorm:"many2many:user_emails;"`
}
type Email struct {
gorm.Model
Address string
Users []User `gorm:"many2many:user_emails;"`
EmailInfo EmailInfo `gorm:"foreignKey:EmailID"`
}
type EmailInfo struct {
gorm.Model
EmailID uint
Read bool
Starred bool
}
type UserEmail struct {
UserID uint
EmailID uint
Read bool
Starred bool
}
func (UserEmail) TableName() string {
return "user_emails"
}
func main() {
db, err := gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/db_name?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
db.AutoMigrate(&User{}, &Email{}, &EmailInfo{}, &UserEmail{})
// 创建用户和邮件
user1 := User{Name: "user1"}
user2 := User{Name: "user2"}
email1 := Email{Address: "email1@example.com"}
email2 := Email{Address: "email2@example.com"}
// 为用户添加邮件
user1.Emails = append(user1.Emails, email1)
user1.Emails = append(user1.Emails, email2)
user2.Emails = append(user2.Emails, email1)
// 保存用户和邮件
db.Save(&user1)
db.Save(&user2)
// 将EmailInfo添加到中间表UserEmail
var user1Emails []UserEmail
db.Model(&user1).Association("Emails").Find(&user1Emails)
for _, user1Email := range user1Emails {
emailInfo := EmailInfo{EmailID: user1Email.EmailID, Read: false, Starred: false}
db.Create(&emailInfo)
user1Email.Read = emailInfo.Read
user1Email.Starred = emailInfo.Starred
db.Save(&user1Email)
}
// 查询用户和邮件以及EmailInfo
var users []User
db.Preload("Emails.EmailInfo").Find(&users)
for _, user := range users {
fmt.Printf("User: %s\n", user.Name)
for _, email := range user.Emails {
fmt.Printf("Email: %s, Read: %t, Starred: %t\n", email.Address, email.EmailInfo.Read, email.EmailInfo.Starred)
}
}
}
```
在上面的示例中,我们使用自定义的中间表`UserEmail`来存储用户和邮件之间的关系,并添加了一个名为`EmailInfo`的结构体来存储`UserEmail`表中的其他信息。我们使用`AssociationMode`方法和`Preload`方法来自定义中间表,并且在查询的时候将自定义中间表的字段一起查询出来。具体来说,我们在`Email`结构体中添加了一个名为`EmailInfo`的字段,并使用`gorm:"foreignKey:EmailID"`标记告诉GORM将`EmailID`列作为`EmailInfo`表的外键。然后,我们在`main`函数中通过创建`UserEmail`结构体并将其保存到数据库中来将`EmailInfo`添加到中间表`UserEmail`中。最后,我们使用`Preload("Emails.EmailInfo")`方法在查询用户和邮件时将`EmailInfo`一起查询出来。