Go-Gorm `has many` не работает под анонимным полем

Я новичок в 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 doc, и он говорит только о первом, который я предоставил, который работает, но я просто хочу знать, можно ли заставить мое неудавшееся дело работать?


person Uturn    schedule 11.10.2019    source источник


Ответы (1)


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

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.

person swagrid    schedule 11.10.2019