问题:
求告诉全局注册钩子的范例
```go
type UserInfo struct {
fmkModel.ID Name string `json:"name" gorm:"not null;comment:用户名称"`
Mobile string `json:"mobile" gorm:"not null;index;comment:用户手机号"`
Password string `json:"password" gorm:"not null;default:'';comment:用户密码"`
fmkModel.CreateUpdate
fmkModel.SoftDeletes
}
type CreateUpdate struct {
CreatedBy uint `json:"created_by"`
CreatedTime time.Time `json:"created_time"`
UpdatedBy uint `json:"updated_by"`
UpdatedTime time.Time `json:"updated_time"`
}
注册全局 hook
DB.Callback().Create().Before("gorm:before_save").Register("my:before_save", bootstrap.MyBeforeSaveHook)
func MyBeforeSaveHook(db *gorm.DB) {
statement := db.Statement
setGormCreateTime(statement, nowTime)
}
func setGormCreateTime(statement *gorm.Statement, nowTime time.Time) {
dest := statement.Dest
value := reflect.ValueOf(dest)
//value &{{0 0001-01-01 00:00:00 +0000 UTC 0 0001-01-01 00:00:00 +0000 UTC} 111111}
fmt.Println("setGormCreateTime value ", value)
valueElem := value.Elem()
//valueElem {{0 0001-01-01 00:00:00 +0000 UTC 0 0001-01-01 00:00:00 +0000 UTC} 111111}
fmt.Println("setGormCreateTime valueElem ", valueElem)
createUpdateField := valueElem.FieldByName("CreateUpdate")
if !createUpdateField.IsValid() {
fmt.Println("setGormCreateTime createUpdateValue 是不合法的")
return
}
fmt.Println("setGormCreateTime createUpdateValue ", createUpdateField.Kind())
if reflect.Struct != createUpdateField.Kind() {
return
}
createdTimeField := createUpdateField.FieldByName("CreatedTime")
// Check if the CreatedTime field is valid and can be set
if createdTimeField.IsValid() && createdTimeField.CanSet() {
// Modify the CreatedTime value
//createdTimeField.Set(reflect.ValueOf(newTime))
statement.SetColumn("CreatedTime", nowTime)
}
}
```
经过如上的尝试,我看到时间已经改变了。但是 sql 执行仍然出现了错误。
```sql
[5567.310ms] [rows:0] INSERT INTO `user_info` (`name`,`mobile`,`password`,`created_by`,`created_time`,`updated_by`,`updated_time`,`del_flag`) VALUES ('张三','18000855903','$2a$04$VfAU4pidT6wI6llBQKT1GuEcd2bmFfnbuSu.YprgXHYwA7Nl5FoJ.',0,'0000-00-00 00:00:00',0,'0000-00-00 00:00:00',0)
[2023-12-08 01:01:05.427] local.error controller/userInfoController.go:21 Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1
```
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.