😓

GoのentでM2M Two TypesのEdgeのカウント

2022/11/09に公開

こうゆう 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),
		})
	}
GitHubで編集を提案

Discussion