// 下面的例子会用到 User 和 Order 结构体 type User struct { gorm.Model Username string Orders Order } type Order struct { gorm.Model UserID uint Price float64 } // Preload 方法的参数应该是主结构体的字段名 db.Preload("Orders").Find(&users) //// SELECT * FROM users; //// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users) //// SELECT * FROM users; //// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users) //// SELECT * FROM users WHERE state = 'active'; //// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
db.Preload("Orders").Preload("Profile").Preload("Role").Find(&users) //// SELECT * FROM users; //// SELECT * FROM orders WHERE user_id IN (1,2,3,4); // has many //// SELECT * FROM profiles WHERE user_id IN (1,2,3,4); // has one //// SELECT * FROM roles WHERE id IN (4,5,6); // belongs to
自动预加载
Gorm 默认总是会自动预加载关联记录
type User struct { gorm.Model Name string CompanyID uint Company Company `gorm:"PRELOAD:false"`// 不会预加载 Role Role // 预加载 }
db.Set("gorm:auto_preload", true).Find(&users)
嵌套预加载
db.Preload("Orders.OrderItems").Find(&users) db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&users)
自定义预加载 SQL
你可以通过传入 func(db *gorm.DB) *gorm.DB 来自定义预加载,比如:
db.Preload("Orders", func(db *gorm.DB) *gorm.DB { return db.Order("orders.amount DESC") }).Find(&users) //// SELECT * FROM users; //// SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;