😓
GoのentでM2M Two TypesのEdgeのカウント
こうゆう M2M の関係の場合、Go の ent で、中間テーブルのカウントを取得したく、試行錯誤した。
これでいいのだろうか?
sitecategory.SitesPrimaryKey[0]
が気持ち悪い
type ResponseSiteCategory struct {
ID int `json:"id"`
Label string `json:"label"`
SitesCount int `json:"sites_count"`
}
var resSiteCategories []*ResponseSiteCategory
err = h.Client.SiteCategory.
Query().
Order(ent.Desc(sitecategory.FieldUpdatedAt)).
Offset(offset).
Limit(pageSize).
GroupBy(sitecategory.FieldID, sitecategory.FieldLabel).
Aggregate(func(s *sql.Selector) string {
t := sql.Table(sitecategory.SitesTable)
s.LeftJoin(t).On(s.C(sitecategory.FieldID), t.C(sitecategory.SitesPrimaryKey[0]))
return sql.As(sql.Count(t.C(sitecategory.SitesPrimaryKey[0])), "sites_count")
}).
Scan(context.Background(), &resSiteCategories)
本当は、こう書きたい
categories, err := h.Client.SiteCategory.
Query().
WithSites().
Order(ent.Desc(sitecategory.FieldUpdatedAt)).
Offset(offset).
Limit(pageSize).
All(context.Background())
resSiteCategories := make([]*ResponseSiteCategory, 0)
for _, category := range categories {
resSiteCategories = append(resSiteCategories, &ResponseSiteCategory{
ID: category.ID,
Label: category.Label,
SitesCount: len(category.Edges.Sites),
})
}
Discussion