多对多(Many to Many)在两个模型之间增加一个 join 表(中间表)。
例如,如果您的应用程序包含用户和语言,并且用户可以说多种语言,并且许多用户可以说出某种语言,用户和语言就有多对多的关系。
定义模型:
// User has and belongs to many languages, use `user_languages` as join table
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
用 AutoMigrate 方法 User 表,会自动创建 user_languages 表,模式为:
CREATE TABLE "user_languages" (
"user_id" integer,
"language_id" integer,
PRIMARY KEY ("user_id","language_id")
);
创建记录
langEN := Language{Name: "EN"}
db.Create(&langEN)
langCN := Language{Name: "CN"}
db.Create(&langCN)
u1 := &User{
Name: "user1",
Languages: []Language{
langEN,
langCN,
},
}
db.Create(u1)
u2 := &User{
Name: "user2",
Languages: []Language{
langCN,
},
}
db.Create(u2)
调用 db.Create(user) 时,不会像 has one 关系那样,把 user.Languages 中的 Language 又去创建一遍。
查询记录
获取 id 为 2 的 user 的语言:
var user User
db.Find(&user, 2)
var languages []Language
db.Model(&user).Related(&languages, "Languages")
查询关联用的 sql:
SELECT "languages".* FROM "languages"
INNER JOIN "user_languages" ON "user_languages"."language_id" = "languages"."id"
WHERE "languages"."deleted_at" IS NULL
AND "user_languages"."user_id" IN (2)
来源:oschina
链接:https://my.oschina.net/u/1248114/blog/3047676