Entgo.io - Many to Many

Entities 1) User 2) Post Relationship One user can have many groups One group can have many users Steps 1) Generate user and post go run -mod=mod entgo.io/ent/cmd/ent new User go run -mod=mod entgo.io/ent/cmd/ent new Group 2) Connect user with group func (User) Edges() []ent.Edge { return []ent.Edge{ edge.To("groups", Group.Type), } } 3) Connect group with user func (Group) Edges() []ent.Edge { return []ent.Edge{ edge.From("users", User.Type).Ref("groups"), } } 4) Try to create user and groups func CreateUser(client *ent.Client, ctx context.Context) { // Create groups g1, _ := client.Group.Create().SetName("Group 1").Save(ctx) g2, _ := client.Group.Create().SetName("Group 2").Save(ctx) // Create user u, _ := client.User.Create().SetName("PP").AddGroups(g1, g2).Save(ctx) } 5) Get user with groups func CreateUser(client *ent.Client, ctx context.Context) { ... userWithGroups, _ := client.User.Query().WithGroups().Where(user.NameEQ("PP")).First(ctx) log.Println("user with groups", userWithGroups.Edges.Groups) }

May 5, 2025 - 12:11
 0
Entgo.io - Many to Many

Entities

1) User
2) Post

Relationship

  • One user can have many groups
  • One group can have many users

Steps

1) Generate user and post

go run -mod=mod entgo.io/ent/cmd/ent new User
go run -mod=mod entgo.io/ent/cmd/ent new Group

2) Connect user with group

func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("groups", Group.Type),
    }
}

3) Connect group with user

func (Group) Edges() []ent.Edge {
    return []ent.Edge{
        edge.From("users", User.Type).Ref("groups"),
    }
}

4) Try to create user and groups

func CreateUser(client *ent.Client, ctx context.Context) {
    // Create groups
    g1, _ := client.Group.Create().SetName("Group 1").Save(ctx)
    g2, _ := client.Group.Create().SetName("Group 2").Save(ctx)

    // Create user
    u, _ := client.User.Create().SetName("PP").AddGroups(g1, g2).Save(ctx)
}

5) Get user with groups

func CreateUser(client *ent.Client, ctx context.Context) {
    ...
    userWithGroups, _ := client.User.Query().WithGroups().Where(user.NameEQ("PP")).First(ctx)
    log.Println("user with groups", userWithGroups.Edges.Groups)
}