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
반응형
'Golang > ORM' 카테고리의 다른 글
[Entgo] About Annotations (0) | 2022.09.03 |
---|---|
[Entgo] About Mixin (0) | 2022.09.01 |
[Entgo] About Indexes (0) | 2022.08.30 |
[Entgo] About Fields (0) | 2022.08.28 |
[Entgo] Entgo ORM란 (0) | 2022.08.18 |