扫码一下
查看教程更方便
作用域允许你复用通用的逻辑,这种共享逻辑需要定义为类型func(*gorm.db) *gorm.db。
scope 查询示例:
func amountgreaterthan1000(db *gorm.db) *gorm.db {
return db.where("amount > ?", 1000)
}
func paidwithcreditcard(db *gorm.db) *gorm.db {
return db.where("pay_mode_sign = ?", "c")
}
func paidwithcod(db *gorm.db) *gorm.db {
return db.where("pay_mode_sign = ?", "c")
}
func orderstatus(status []string) func (db *gorm.db) *gorm.db {
return func (db *gorm.db) *gorm.db {
return db.where("status in (?)", status)
}
}
db.scopes(amountgreaterthan1000, paidwithcreditcard).find(&orders)
// 查找所有金额大于 1000 的信用卡订单
db.scopes(amountgreaterthan1000, paidwithcod).find(&orders)
// 查找所有金额大于 1000 的 cod 订单
db.scopes(amountgreaterthan1000, orderstatus([]string{"paid", "shipped"})).find(&orders)
// 查找所有金额大于1000 的已付款或已发货订单
func paginate(r *http.request) func(db *gorm.db) *gorm.db {
return func (db *gorm.db) *gorm.db {
q := r.url.query()
page, _ := strconv.atoi(q.get("page"))
if page == 0 {
page = 1
}
pagesize, _ := strconv.atoi(q.get("page_size"))
switch {
case pagesize > 100:
pagesize = 100
case pagesize <= 0:
pagesize = 10
}
offset := (page - 1) * pagesize
return db.offset(offset).limit(pagesize)
}
}
db.scopes(paginate(r)).find(&users)
db.scopes(paginate(r)).find(&articles)
使用 scopes 来动态指定查询的表
func tableofyear(user *user, year int) func(db *gorm.db) *gorm.db {
return func(db *gorm.db) *gorm.db {
tablename := user.tablename() strconv.itoa(year)
return db.table(tablename)
}
}
db.scopes(tableofyear(user, 2019)).find(&users)
// select * from users_2019;
db.scopes(tableofyear(user, 2020)).find(&users)
// select * from users_2020;
// table form different database
func tableoforg(user *user, dbname string) func(db *gorm.db) *gorm.db {
return func(db *gorm.db) *gorm.db {
tablename := dbname "." user.tablename()
return db.table(tablename)
}
}
db.scopes(tableoforg(user, "org1")).find(&users)
// select * from org1.users;
db.scopes(tableoforg(user, "org2")).find(&users)
// select * from org2.users;
scope 更新、删除示例:
func curorganization(r *http.request) func(db *gorm.db) *gorm.db {
return func (db *gorm.db) *gorm.db {
org := r.query("org")
if org != "" {
var organization organization
if db.session(&session{}).first(&organization, "name = ?", org).error == nil {
return db.where("org_id = ?", organization.id)
}
}
db.adderror("invalid organization")
return db
}
}
db.model(&article).scopes(curorganization(r)).update("name", "name 1")
// update articles set name = "name 1" where org_id = 111
db.scopes(curorganization(r)).delete(&article{})
// delete from articles where org_id = 111