扫码一下
查看教程更方便
gorm 提供了 set
, get
, instanceset
, instanceget
方法来允许用户传值给 勾子 或其他方法
gorm 中有一些特性用到了这种机制,如迁移表格时传递表格选项。
// 创建表时添加表后缀
db.set("gorm:table_options", "engine=innodb").automigrate(&user{})
使用 set / get
传递设置到钩子方法,例如:
type user struct {
gorm.model
creditcard creditcard
// ...
}
func (u *user) beforecreate(tx *gorm.db) error {
myvalue, ok := tx.get("my_value")
// ok => true
// myvalue => 123
}
type creditcard struct {
gorm.model
// ...
}
func (card *creditcard) beforecreate(tx *gorm.db) error {
myvalue, ok := tx.get("my_value")
// ok => true
// myvalue => 123
}
myvalue := 123
db.set("my_value", myvalue).create(&user{})
使用 instanceset / instanceget
传递设置到 *statement
的钩子方法,例如:
type user struct {
gorm.model
creditcard creditcard
// ...
}
func (u *user) beforecreate(tx *gorm.db) error {
myvalue, ok := tx.instanceget("my_value")
// ok => true
// myvalue => 123
}
type creditcard struct {
gorm.model
// ...
}
// 在创建关联时,gorm 创建了一个新 `*statement`,所以它不能读取到其它实例的设置
func (card *creditcard) beforecreate(tx *gorm.db) error {
myvalue, ok := tx.instanceget("my_value")
// ok => false
// myvalue => nil
}
myvalue := 123
db.instanceset("my_value", myvalue).create(&user{})