Golang/ORM

[Entgo] About Edges

GenieLove! 2022. 8. 29. 00:44
728x90
반응형

Edges

To and From

  • edge.To
    • 1 : N 일 때 1인 테이블의 Edges()에 To
    • edge를 정의하는 스키마 관계를 소유
  • edge.From 
    • 1 : N 일 때 N인 테이블의 Edges()에 From
    • 관계에 대한 역참조를 제공하는 빌더

O2O

  • O2O other entity
    • User Entity : Card Entity
    • 두 Entity에 Unique()를 지정함으로써 가능
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("card", Card.Type).
            Unique(),
    }
}
//ent/schema/card.go
func (Card) Edges() []ent.Edge {
    return []ent.Edge{
        edge.From("owner", User.Type).
            Ref("card").
            Unique().
            Required(),//Required()는 필수로 요구될 때만 사용, Card는 항상 사용하는 사람이 있어야 하므로, 생성 시 필수로 요구된다.
    }
}
  • O2O same entity
    • From, To를 Edge에 동시에 작성하므로써 가능
//ent/schema/node.go
func (Node) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("next", Node.Type).
            Unique().
            From("prev").
            Unique(),
    }
}
  • O2O 현재 entity 참조
    • 대칭 O2O 관계로 A entity가 B entity와 연결되어있다고 선언 시, B entity의 값에도 A entity가 연결되어 있다고 본다.
    • ex) 본인 & 배우자
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("spouse", User.Type).//spouse라는 연관관계로 자신의 테이블을 연관관계로 지정
            Unique(),
    }
}

O2M

  • O2M other entity
    • ex) 보호자 & 강아지
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("pets", Pet.Type),
    }
}
//ent/schema/pet.go
func (Pet) Edges() []ent.Edge {
    return []ent.Edge{
        edge.From("owner", User.Type).
            Ref("pets").
            Unique(),//pet테이블에 owner_pets라는 컬럼이 생기게 된다.
    }
}
  • O2M same entity
    • 재귀적 O2M 관계
//ent/schema/node.go
func (Node) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("children", Node.Type).
            From("parent").
            Unique(),
    }
}

M2M

-> 연관시키는 다른 테이블이 생성된다.

  • M2M other entity
//ent/schema/group.go
func (Group) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("users", User.Type),//group에는 많은 사용자가 있다.
    }
}
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.From("groups", Group.Type).
            Ref("users"),//user는 많은 그룹에 속해있다.
    }
}
  • M2M same entity
    • ex) 사용자 & 팔로워 & 팔로잉
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("following", User.Type).
            From("followers"),
    }
}
  • M2M 현재 entity 참조
    • 대칭 M2M 관계
    • ex) 사용자 & 친구 -> A가 B를 친구로 하면, B도 A를 친구로 한다.
//ent/schema/user.go
func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("friends", User.Type),
    }
}

Edge Field

  • Field를 사용하면 외부키를 스키마의 일반 필드로 노출할 수 있다.
  • 외래키를 보유하는 관계에서만 Field를 사용할 수 있다.
//ent/schema/post.go
func (Post) Fields() []ent.Field {
    return []ent.Field{
        field.Int("author_id").
            Optional(),
    }
}


func (Post) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("author", User.Type).
            Field("author_id").//author_id를 외래키로 지정한다.
            Unique(),
    }
}

 

728x90
반응형