feat(repository): enhance repository methods with batch processing and transaction support
- Updated Like and Unlike methods in CommentRepository to use transactions for data consistency. - Introduced IsLikedBatch method for batch checking if comments are liked, addressing N+1 query issues. - Enhanced BatchDelete method in PostRepository to perform batch deletions within a single transaction, improving efficiency. - Added BatchUpdateStatus method for posts to utilize a single SQL update for status changes, reducing database load. - Implemented BatchUpdateSortOrder in StickerRepository using CASE WHEN for efficient sorting updates. - Added IsFollowingBatch and IsBlockedBatch methods in UserRepository for batch checking follow and block relationships, optimizing performance.
This commit is contained in:
@@ -2,6 +2,7 @@ package repository
|
||||
|
||||
import (
|
||||
"carrot_bbs/internal/model"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@@ -88,18 +89,31 @@ func (r *stickerRepository) UpdateSortOrder(id string, sortOrder int) error {
|
||||
Update("sort_order", sortOrder).Error
|
||||
}
|
||||
|
||||
// BatchUpdateSortOrder 批量更新排序
|
||||
// BatchUpdateSortOrder 批量更新排序(使用 CASE WHEN 批量更新,避免 N+1 问题)
|
||||
func (r *stickerRepository) BatchUpdateSortOrder(userID string, orders map[string]int) error {
|
||||
return r.db.Transaction(func(tx *gorm.DB) error {
|
||||
for id, sortOrder := range orders {
|
||||
if err := tx.Model(&model.UserSticker{}).
|
||||
Where("id = ? AND user_id = ?", id, userID).
|
||||
Update("sort_order", sortOrder).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(orders) == 0 {
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// 构建 CASE WHEN 批量更新 SQL
|
||||
var cases []string
|
||||
var args []any
|
||||
|
||||
for id, sortOrder := range orders {
|
||||
cases = append(cases, "WHEN id = ? THEN ?")
|
||||
args = append(args, id, sortOrder)
|
||||
}
|
||||
|
||||
ids := make([]string, 0, len(orders))
|
||||
for id := range orders {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
|
||||
sql := `UPDATE user_stickers SET sort_order = CASE ` +
|
||||
strings.Join(cases, " ") + ` END WHERE id IN ? AND user_id = ?`
|
||||
args = append(args, ids, userID)
|
||||
|
||||
return r.db.Exec(sql, args...).Error
|
||||
}
|
||||
|
||||
// CountByUserID 获取用户表情数量
|
||||
|
||||
Reference in New Issue
Block a user