Самореферентная структура, записи с предустановленными родителями переключаются между родителями и детьми - PullRequest
1 голос
/ 08 апреля 2019

У меня есть структура, которая ссылается на себя, и когда я пытаюсь извлечь данные с помощью Preload, запись каким-то образом переключается между родителем и дочерним элементом.

В этом примере я создал эти записи:

  1. Лицо, называемое Менеджером 1
  2. Лицо, называемое Сотрудником 1, у которого Менеджер 1 является его родителем
  3. Лицо, называемое Менеджером 2
  4. Человек по имени Сотрудник 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(&Person{})

    db.Delete(Person{})

    newManager := Person{
        Name    : "Manager 1",
    }
    db.Create(&newManager)

    managerID := newManager.ID

    newEmployee := Person{
        Name    : "Employee 1",
        Parent  : managerID,
    }
    db.Create(&newEmployee)

    newManager = Person{
        Name    : "Manager 2",
    }
    db.Create(&newManager)

    managerID = newManager.ID

    newEmployee = Person{
        Name    : "Employee 2",
        Parent  : managerID,
    }
    db.Create(&newEmployee)

    persons := []Person{}

    db.Preload("Parent_").Find(&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
---------------------------------

Почему?

...