1. 钩子

    钩子是一个在 插入/查询/更新/删除 之前或之后被调用的方法。

    如果你在一个模型中定义了特殊的方法,它将会在插入,更新,查询,删除的时候被自动调用,如果任何的回调抛出错误,GORM 将会停止将要执行的操作并且回滚当前的改变。

    1.2. 钩子

    可用于创建的钩子

    1. if u.IsValid() {
    2. err = errors.New("can't save invalid data")
    3. }
    4. return
    5. }
    6. func (u *User) AfterCreate(scope *gorm.Scope) (err error) {
    7. if u.ID == 1 {
    8. scope.DB().Model(u).Update("role", "admin")
    9. return
    10. }

    注意,在 GORM 中的保存/删除 操作会默认进行事务处理,所以在事物中,所有的改变都是无效的,直到它被提交为止:

    1. func (u *User) AfterCreate(tx *gorm.DB) (err error) {
    2. tx.Model(u).Update("role", "admin")
    3. }

    可用于更新的钩子

    代码示例:

    1. func (u *User) BeforeUpdate() (err error) {
    2. if u.readonly() {
    3. err = errors.New("read only user")
    4. }
    5. return
    6. }
    7. // 在事务结束后,进行更新数据
    8. func (u *User) AfterUpdate(tx *gorm.DB) (err error) {
    9. if u.Confirmed {
    10. }
    11. return
    1. // 开启事务
    2. BeforeDelete
    3. // 删除自身
    4. AfterDelete
    5. // 提交或回滚事务

    代码示例:

    可用于查询的钩子

    1. // 从数据库中读取数据
    2. // 加载之前 (急于加载)
    3. AfterFind

    代码示例:

    1. func (u *User) AfterFind() (err error) {
    2. if u.MemberShip == "" {
    3. u.MemberShip = "user"
    4. }
    5. return