# 다음과 department:member 가 M:N 관계인 테이블이 있을때
[departments table]
id uint
name string
[members table]
id uint
name string
[departments_members table](관계 매핑테이블/join table)
id uint
department_key uint
member_key uint
val1 string
val2 string
# 조인 테이블은 다음과 같이 FK 를 설정했다.
`FK_MEMBERS` FOREIGN KEY (`member_key`) REFERENCES `members` (`id`)
`FK_DEPARTMENTS` FOREIGN KEY (`department_key`) REFERENCES `departments` (`id`),
# golang gorm 사용시
# 사용 테이블 이름 설정
type Tabler interface { TableName() string}
func (Department) TableName() string { return "departments" }
func (Member) TableName() string { return "members" }
# 부서 조회시 부서에 속한 멤버들을 조회를 한다고 했을때
# many2many 로 조인테이블 departments_members 을 참고하도록 했고
type Member struct {
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
Name string `gorm:"unique;size:100;not null" json:"name"`
Departments []Department `gorm:"many2many:departments_members;" json:"departments,omitempty"`
}
type Department struct {
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
Name string `gorm:"unique;size:100;not null" json:"name"`
Members []Member `gorm:"many2many:departments_members; "json:"members,omitempty"`
}
# 다음과 preload 로 멤버가 포함된 부서를 조회를 하면
err := ysoftmanMysql.Db.Model(&db.Department{}).Preload("Members").Find(&department, "name = ?", name).Error
# 다음과 같이 department_id 를 알 수 없다고 나온다.
Error 1054 (42S22): Unknown column 'departments_members.department_id' in 'where clause'
# 기본적으로 foreignkey로 모델명(struct)+pk 를 붙인 이름(department_id)필드를 사용한다.
# departments_members 의 필드명을 다음과 같이 바꾸면 된다.
department_key -> department_id
member_key -> member_id
# 참고
# github.com/jinzhu/gorm -> 1.x
# gorm.io/gorm -> 2.x
#####
# departments_members 테이블 자체에 있는 val1,val2 필드고 같이 조회 하기
func (DepartmentsMembers) TableName() string { return "departments_members" }
type Member struct {
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
Name string `gorm:"unique;size:100;not null" json:"name"`
# DepartmentMembers 에서 MemberID 로 조회 할 수 있도록 한다.
DepartmentMembers []DepartmentMembers `gorm:"foreignkey:MemberID" json:"users,omitempty"`
}
type Department struct {
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
Name string `gorm:"unique;size:100;not null" json:"name"`
# DepartmentMembers 에서 DepartmentID 로 조회 할 수 있도록 한다.
DepartmentMembers []DepartmentMembers `gorm:"foreignkey:DepartmentID" json:"users,omitempty"`
}
# DepartmentsMembers 데이터추가고 이곳에서 Member, Department 를 담을 수 있도록 한다.
type DepartmentsMembers struct {
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
MemberID uint64 `gorm:"";auto_increment" json:"user_id,omitempty"`
DepartmentID uint64 `gorm:"" json:"user_id,omitempty"`
Member *Member `json:"member,omitempty"`
Department *Department `json:"department,omitempty"`
}
# Department 조회시 멤버 정보가 포함해서 조회
# DepartmentsMember.Member 를 한번 더 프리로드 한다.
err := ysoftmanMysql.Db.Preload("DepartmentsMember").Preload("DepartmentsMember.Member").Find(&project, "project_id = ?", id).Error