Go-Gorm `has many` не работает под анонимным полем - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в golang gorm, и недавно столкнулся с проблемой ассоциации.

Созданная мной структура:

type DeliveryItem struct {
  ..........
  Targets  []TargetType     `json:"targets" gorm:"foreignkey:FK"`
}

Я создаю структуру с именем TargetType, например:

type TargetType struct {
    name            string
    FK      int             
}

Итак, если я публикую некоторые данные с массивом целей, он сначала сохранит данные в таблице элементов доставки (но без данных целей) и сохранит цели в отдельной таблице. Все работает с вышеуказанной структурой.

Однако, если я создаю анонимное поле и помещаю Targets внутри анонимного поля, то gorm не вставляет данные этих целей в таблицу. Похоже, что он не распознает связь между DeliveryItem и TargetType

Вот пример, который не работает (для простоты я не предоставил точный код):

type DeliveryItem struct {
  ..........
  CommonDetails 
}

type CommonDetails struct {
  ................
  Targets  []TargetType     `json:"targets" gorm:"foreignkey:FK"`
}

type TargetType struct {
    name            string
    FK      int             
}

Разве япропустить что-нибудь для тега gorm, чтобы заставить его работать, или Gorm не поддерживает такое поведение? Я проверил документ gorm, и он говорит только о первой предоставленной мной информации, которая работает, но я просто хочу, можно ли заставить работать мой неудачный случай?

1 Ответ

0 голосов
/ 12 октября 2019

Я был бы удивлен, если бы ваш неудачный случай мог работать, так как структура базовых полей принципиально отличается. Вы можете увидеть разницу при использовании примера кода ниже.

package main

import "fmt"

type DeliveryItemEmbedded struct {
    CommonDetails
}

type DeliveryItem struct {
    Targets []TargetType `json:"targets" gorm:"foreignkey:FK"`
}

type CommonDetails struct {
    Targets []TargetType `json:"targets" gorm:"foreignkey:FK"`
}

type TargetType struct {
    name string
    FK   int
}

func main() {

    targets := []TargetType{
        TargetType{
            name: "target 1",
            FK:   2,
        },
    }

    cd := CommonDetails{
        Targets: targets,
    }

    die := DeliveryItemEmbedded{
        cd,
    }

    di := DeliveryItem{
        Targets: targets,
    }

    fmt.Printf("embedded: %+v\n", die)
    fmt.Printf("non-embedded: %+v\n", di)
}

дает:

embedded: {CommonDetails:{Targets:[{name:target 1 FK:2}]}}
non-embedded: {Targets:[{name:target 1 FK:2}]}

Я не знаю, как работает gorm под капотом, но я был бы удивлен, если быон смог разрешить косвенное обращение CommonDetails. К сожалению, я не думаю, что использование встраивания будет работать с gorm в этом случае.

...