Gorm many2many关系中如何使用预加载查询
gorm中,若两个实体A、B之间关系为m:n。如果查询A时候需要Preload(B),那么db查询之前需要设置
db.SetupJoinTable()。
例子:
Person : Address = m : n。
type Person struct {
ID int //1
Name string //小猫猫
Addresses []Address `gorm:"many2many:person_addresses;"`
}
type Address struct {
ID uint //1 2
Name string //猫窝 狗窝
}
type PersonAddress struct {
PersonID int //1 1
AddressID int //1 2
CreatedAt time.Time //2023-06-21 13:44:00 2023-06-21 13:44:00
DeletedAt gorm.DeletedAt //null 2023-06-21 13:44:00
}
func PageList() {
//伪代码
db := *gorm.DB
var persons []Person
db = db.Model(&Persion)
// 设置中间表 Persion表的Address, 中间表PersionAddress
err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})
db.Limit(10).Offset(0).Find(&persons)
// 如果没有设置中间表,PersonAddress中软删除的记录也会被查询出来。
// 例子:注释掉这句 err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{}),查询出来小猫猫有猫窝、狗窝。
// 如果不注释,查询出来的小猫猫只有猫窝
}