From 60626e7ca5389fa663b738697eaa3d814b872acb Mon Sep 17 00:00:00 2001 From: satori Date: Wed, 27 Nov 2024 21:58:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=88=97=E8=A1=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/graphql.go | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/api/graphql.go b/api/graphql.go index a6dbf99..a7b8311 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -532,8 +532,8 @@ func NewSchema(config Config) (graphql.Schema, error) { Name: "GameConnection", Description: "条件筛选游戏列表", Fields: graphql.Fields{ - "list": &graphql.Field{Type: graphql.NewList(game), Description: "游戏列表"}, - //"total": &graphql.Field{Type: graphql.Int, Description: "游戏总数"}, + "list": &graphql.Field{Type: graphql.NewList(game), Description: "游戏列表"}, + "total": &graphql.Field{Type: graphql.Int, Description: "游戏总数"}, }, }), Args: graphql.FieldConfigArgument{ @@ -561,35 +561,46 @@ func NewSchema(config Config) (graphql.Schema, error) { var total int var err error - var query = goqu.Dialect("mysql").From("web_article") + var query = goqu.Dialect("mysql").From("web_article").Where(goqu.Ex{"category_top_id": 22}) // 筛选条件 - for _, format := range []string{"id", "style", "device", "orientation", "era", "category_id", "tags"} { + for _, format := range []string{"id", "title", "style", "device", "orientation", "era", "category_id", "tags"} { if p.Args[format] != nil { query = query.Where(goqu.C(format).Eq(p.Args[format])) } } - // 排序条件 - if p.Args["sort"] != nil { - if p.Args["order"].(string) == "ASC" { - query = query.Order(goqu.C(p.Args["sort"].(string)).Asc()) - } - if p.Args["order"].(string) == "DESC" { - query = query.Order(goqu.C(p.Args["sort"].(string)).Desc()) + // 如果查询了 total 字段 + if p.Info.FieldASTs[0].SelectionSet.Selections[1] != nil { + sql, _, _ := query.ToSQL() + fmt.Println(sql) + sql = strings.Replace(sql, "SELECT *", "SELECT COUNT(*)", 1) + fmt.Println(sql) + if err := db.Raw(sql).Scan(&total).Error; err != nil { + return nil, err } } // 如果没有外部排序则使用指定排序(正则sort只能是字母数字下划下) if p.Args["text"] == nil && p.Args["similar"] == nil && p.Args["interest"] == nil { sort := regexp.MustCompile(`[^a-zA-Z0-9_]`).ReplaceAllString(p.Args["sort"].(string), "") - query = query.Select("web_images.id", goqu.L( - fmt.Sprintf("ROW_NUMBER() OVER(ORDER BY web_images.%s %s)", sort, p.Args["order"]), + query = query.Select("web_article.id", goqu.L( + fmt.Sprintf("ROW_NUMBER() OVER(ORDER BY web_article.%s %s)", sort, p.Args["order"]), ).As("row_num")) + } else { + // 排序条件 + if p.Args["sort"] != nil { + if p.Args["order"].(string) == "ASC" { + query = query.Order(goqu.C(p.Args["sort"].(string)).Asc()) + } + if p.Args["order"].(string) == "DESC" { + query = query.Order(goqu.C(p.Args["sort"].(string)).Desc()) + } + } } // 取所有数据的前N条 - sql, _, _ := query.Where(goqu.Ex{"article_category_top_id": 22}).ToSQL() + sql, _, _ := query.ToSQL() fmt.Println(sql) // 遊標截取篩選結果集的前N条 @@ -607,13 +618,14 @@ func NewSchema(config Config) (graphql.Schema, error) { sql = fmt.Sprintf(` WITH RankedArticles AS (%s) - SELECT * FROM web_images INNER JOIN( + SELECT * FROM web_article INNER JOIN( SELECT id, row_num FROM RankedArticles %s - ) AS LimitedRanked ON LimitedRanked.id = web_images.id + ) AS LimitedRanked ON LimitedRanked.id = web_article.id ORDER BY LimitedRanked.row_num ASC LIMIT %d `, sql, cursor, limit) - if err := db.Limit(limit).Where("category_top_id = 22").Find(&games).Error; err != nil { + if err := db.Raw(sql).Scan(&games).Error; err != nil { + fmt.Println("获取游戏列表失败", err) return nil, err }