Как получить сумму числового столбца в Ent

У меня есть две таблицы: и baskets, которые имеют M2Mотношение и имя таблицы basket_products. Я пытаюсь получить конкретную информацию, связанную с корзиной productsобщий priceи количество, но я снова застрял. Как я могу исправить следующий код, чтобы получить результат? примечание: я использую Entрамки

         err = client.Basket.
        Query().
        Where(basket.ID(2)).
        WithProducts().
        QueryProducts().
        GroupBy("price").
        Aggregate(func(selector *sql.Selector) string {
            return sql.As(sql.Sum("price"), "price")
        }).Scan(ctx, &r)
    if err != nil {
        log.Println(err)
    }
    log.Println(r)

2 ответа

В Aggregateа также GroupByфункции - друзья. Агрегация | Энт

Я изменил код, как показано ниже, и получил очень оптимизированный запрос, благодаря команде Ent.

      err := client.Basket.
        Query().
        Where(basketEntity.ID(ID)).
        GroupBy(basketEntity.FieldID).
        Aggregate(func(s *sql.Selector) string {
            t := sql.Table(product.Table)
            joinT := sql.Table(basketEntity.ProductsTable)
            s.Join(joinT).
                On(s.C(basketEntity.FieldID), joinT.C(basketEntity.ProductsPrimaryKey[0]))
            s.Join(t).
                On(t.C(product.FieldID), joinT.C(basketEntity.ProductsPrimaryKey[1]))
            return sql.As(sql.Sum(t.C(product.FieldPrice)), "price")
        }).
        Aggregate(repository.Count()).
        Scan(ctx, &report)

Сгенерированный SQL:

      SELECT "baskets"."id", SUM("t2"."price") AS "price", COUNT(*) 
FROM "baskets" 
JOIN "basket_products" AS "t1" ON "baskets"."id" = "t1"."basket_id" 
JOIN "products" AS "t2" ON "t2"."id" = "t1"."product_id" 
WHERE "baskets"."id" = $1 
GROUP BY "baskets"."id" args=[1]

Вы пытались изменить GroupBy("price")к GroupBy(Basket.FieldPrice)т.е. обращение к полям по сгенерированному имени поля. Пример Group By Edge должен быть похож на https://entgo.io/docs/aggregate/

Другие вопросы по тегам