教程 > gorm 教程 > 阅读:118

gorm 作用域 scope——迹忆客-ag捕鱼王app官网

作用域允许你复用通用的逻辑,这种共享逻辑需要定义为类型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

查看笔记

扫码一下
查看教程更方便
网站地图