package model import ( "context" "fmt" "git.noahlan.cn/northlan/ntools-go/gorm-zero/gormx" "gorm.io/gorm" ) var _ RankPvpModel = (*customRankPvpModel)(nil) const MaxRankN = 50 type ( // RankPvpModel is an interface to be customized, add more methods here, // and implement the added methods in customRankPvpModel. RankPvpModel interface { rankPvpModel RankListByType(ctx context.Context, rankType, topN int64) ([]RankPvpWithPlatformUser, error) UpdateRank(ctx context.Context, rankType int64, data []RankPvp) error } customRankPvpModel struct { *defaultRankPvpModel } RankPvpWithPlatformUser struct { RankPvp Platform string // 平台类型 PUname string // 平台用户名 PAvatar string // 平台用户头像地址 } ) // NewRankPvpModel returns a model for the database table. func NewRankPvpModel(conn *gorm.DB) RankPvpModel { return &customRankPvpModel{ defaultRankPvpModel: newRankPvpModel(conn), } } func (m *customRankPvpModel) RankListByType(ctx context.Context, rankType, topN int64) ([]RankPvpWithPlatformUser, error) { db := m.DB.WithContext(ctx) limit := topN if limit > MaxRankN { limit = MaxRankN } var result []RankPvpWithPlatformUser err := db.Model(&RankPvpWithPlatformUser{}). Select(fmt.Sprintf("%s.*, UP.platform, UP.p_uname, UP.p_avatar", m.table)). Joins(fmt.Sprintf("LEFT JOIN user_platform UP ON UP.user_id = %s.user_id", m.table)). Where(fmt.Sprintf("%s.user_id > 0 AND rank_type = ?", m.table), rankType). Limit(int(limit)). Find(&result).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return result, nil } func (m *customRankPvpModel) UpdateRank(ctx context.Context, rankType int64, data []RankPvp) error { db := m.DB.WithContext(ctx) return db.Transaction(func(tx *gorm.DB) error { var err error // delete all by rank_type if err = tx. Table(m.table). Where("rank_type = ?", rankType). Delete(&RankPvp{}).Error; err != nil { return err } // add all if err = tx. Create(data).Error; err != nil { return err } return nil }) }