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) }

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)
}