package vote import ( "context" "github.com/gogf/gf/v2/frame/g" v1 "practice_ArticleVote_Go/api/vote/v1" ) func (l *VoteLogic) GetAllVote(ctx context.Context, req *v1.VoteReq) (res *v1.VoteRes, err error) { res = &v1.VoteRes{ Total: 0, Rows: []v1.Vote{}, } query := ` SELECT a.article_title AS articleTitle, v.id AS voteId, v.vote_title AS voteTitle, v.create_time AS createTime, v.deadline_time AS deadlineTime, v.status FROM article a INNER JOIN vote_poll v ON a.id = v.article_id WHERE a.user_id = ? AND a.vote_status = 1 ` conditions := []interface{}{req.UserId} if req.ArticleTitle != "" { query += " AND a.article_title LIKE ?" conditions = append(conditions, "%"+req.ArticleTitle+"%") } if req.VoteTitle != "" { query += " AND v.vote_title LIKE ?" conditions = append(conditions, "%"+req.VoteTitle+"%") } if req.CreateTime != nil && !req.CreateTime.IsZero() { query += " AND DATE(v.create_time) = ?" conditions = append(conditions, req.CreateTime) } if req.DeadlineTime != nil && !req.DeadlineTime.IsZero() { query += " AND DATE(v.deadline_time) = ?" conditions = append(conditions, req.DeadlineTime) } if req.Status != 0 { query += " AND v.status = ?" conditions = append(conditions, req.Status) } // 构造 countQuery:使用相同的 baseQuery 和 WHERE 条件,但只统计行数 var cntResult struct{ Cnt int } countQuery := "SELECT COUNT(*) AS cnt FROM (" + query + ") AS subquery" err = g.DB().Ctx(ctx). Raw(countQuery, conditions...). Scan(&cntResult) res = &v1.VoteRes{ Total: cntResult.Cnt, } if err != nil { return nil, err } query += " ORDER BY v.create_time DESC " query += " LIMIT ?, ? " offset := (req.Page - 1) * req.PageSize conditions = append(conditions, offset, req.PageSize) err = g.DB().Ctx(ctx). Raw(query, conditions...). Scan(&res.Rows) if err != nil { return nil, err } // 设置分页信息 res.Page = req.Page res.PageSize = req.PageSize return res, nil }