gorm中动态使用表名
阅读原文时间:2023年07月08日阅读:3

用户表(前台、后台)

type User struct {
    ID        int            `gorm:"primaryKey;autoIncrement"`
    Name      sql.NullString `gorm:"default:'隔壁老王'"`
    Age       uint8          `gorm:"default:55"`
    UUID      uuid.UUID
    CreatedAt time.Time      `gorm:"autoCreateTime"`
    Deleted   gorm.DeletedAt `gorm:"autoDeleteTime"`
}
type AdminUser struct {
    ID        int            `gorm:"primaryKey;autoIncrement"`
    Name      sql.NullString `gorm:"default:'隔壁老王'"`
    Age       uint8          `gorm:"default:55"`
    UUID      uuid.UUID
    CreatedAt time.Time      `gorm:"autoCreateTime"`
    Deleted   gorm.DeletedAt `gorm:"autoDeleteTime"`
}

type DynamicUser interface {
    IsAdmin() bool
}

func (*User) IsAdmin() bool {
    return true
}
func (*AdminUser) IsAdmin() bool {
    return false
}

动态获取表名

func UserTable(u DynamicUser) func(tx *gorm.DB) *gorm.DB {
    return func(tx *gorm.DB) *gorm.DB {
        if u.IsAdmin() {
            return tx.Table("users")
        }
        return tx.Table("admin_users")
    }
}

测试

type APIUser struct {
    ID int
    Name string
    Age int
}

// TableName 不支持动态变化,它会被缓存下来以便后续使用。想要使用动态表名,你可以使用 Scopes,例如:
var apiUser APIUser
var user DynamicUser
user = &User{}

db.Scopes(UserTable(user)).Scan(&apiUser)
fmt.Println(apiUser)

user = &AdminUser{}
db.Scopes(UserTable(user)).Scan(&apiUser)
fmt.Println(apiUser)

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章