#go #go-gorm
#Вперед #go-gorm
Вопрос:
У меня есть структура, которая ссылается на себя, и когда я пытаюсь получить данные с помощью Preload
записи, она каким-то образом переключается между родительским и дочерним элементами.
В этом примере я создал эти записи:
- Человек, вызванный менеджером 1
- Человек, называемый сотрудником 1, у которого есть менеджер 1 в качестве его родителя
- Человек, вызванный менеджером 2
- Человек, называемый сотрудником 2, у которого есть менеджер 2 в качестве его родителя
Вот код:
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
type Person struct {
ID int `gorm:"primary_key"`
Name string
Parent int
Parent_ *Person `gorm:"foreignkey:parent"`
}
func (Person) TableName() string {
return "go_person"
}
const (
DB_ADAPTER = "postgres"
DB_HOST = "localhost"
DB_USER = "postgres"
DB_PASSWORD = "test"
DB_NAME = "test"
DB_SSLMODE = "disable"
)
func main() {
db, err := gorm.Open(DB_ADAPTER, "host=" DB_HOST " user=" DB_USER " dbname=" DB_NAME " sslmode=disable" " password=" DB_PASSWORD "")
if err != nil {
panic("failed to open storage")
}
defer db.Close()
db.AutoMigrate(amp;Person{})
db.Delete(Person{})
newManager := Person{
Name : "Manager 1",
}
db.Create(amp;newManager)
managerID := newManager.ID
newEmployee := Person{
Name : "Employee 1",
Parent : managerID,
}
db.Create(amp;newEmployee)
newManager = Person{
Name : "Manager 2",
}
db.Create(amp;newManager)
managerID = newManager.ID
newEmployee = Person{
Name : "Employee 2",
Parent : managerID,
}
db.Create(amp;newEmployee)
persons := []Person{}
db.Preload("Parent_").Find(amp;persons)
for _, person := range persons {
fmt.Println("Name :",person.Name)
if person.Parent_ != nil {
fmt.Println("Manager :",person.Parent_.Name)
}
fmt.Println("---------------------------------")
}
}
В этом примере я ожидаю получить это в качестве результата:
Name : Manager 1
---------------------------------
Name : Employee 1
Manager : Manager 1
---------------------------------
Name : Manager 2
---------------------------------
Name : Employee 2
Manager : Manager 2
---------------------------------
Но вместо этого я получил это:
Name : Manager 1
Manager : Employee 1
---------------------------------
Name : Employee 1
---------------------------------
Name : Manager 2
Manager : Employee 2
---------------------------------
Name : Employee 2
---------------------------------
Почему?