Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

模型创建

Table/Model方法用于创建指定数据表的Model对象。

...

m := g.DB("user-center").Table("user")

链式安全

链式安全只是模型操作的两种方式区别:一种会修改当前model对象(不安全,默认),一种不会(安全)但是模型属性修改/条件叠加需要使用赋值操作,仅此而已。

默认情况

在默认情况下,gdb非链式安全的,也就是说链式操作的每一个方法都将对当前操作的Model属性进行修改,因此该Model对象不可以重复使用。例如,当存在多个分开查询的条件时,我们可以这么来使用Model对象:

...

默认情况下,基于性能以及GC优化考虑,模型对象为非链式安全,防止产生过多的临时模型对象。

Clone方法

此外,我们也可以手动调动Clone方法克隆当前模型,创建一个新的模型来实现链式安全,由于是新的模型对象,因此并不担心会修改已有的模型对象的问题。例如:

...

// 克隆一个新的用户模型
m := user.Clone()
m.Where("status IN(?)", g.Slice{1,2,3})
if vip {
    m.And("money>=?", 1000000)
} else {
    m.And("money<?",  1000000)
}
//  vip: SELECT * FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT * FROM user WHERE status IN(1,2,3) AND money < 1000000
r, err := m.All()
//  vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money < 1000000
n, err := m.Count()

Safe方法

当然,我们可以通过Safe方法设置当前模型为链式安全的对象,后续的每一个链式操作都将返回一个新的Model对象,该Model对象可重复使用。但需要特别注意的是,模型属性的修改,或者操作条件的叠加,需要通过变量赋值的方式(m = m.xxx)覆盖原有的模型对象来实现。例如:

...