feat(repository): enhance repository methods with batch processing and transaction support
All checks were successful
Build Backend / build (push) Successful in 12m50s
Build Backend / build-docker (push) Successful in 2m57s

- 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:
lafay
2026-03-26 01:50:54 +08:00
parent 56bd971e42
commit 7b41dfeb00
9 changed files with 386 additions and 109 deletions

View File

@@ -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 获取用户表情数量