Не удается заставить ассоциации GORM работать должным образом

Мои две модели

package models

// Business ...
type Business struct {
    ID     uint
    Name   string `gorm:"not null"`
    Tables Tables `gorm:"ForeignKey:BusinessID"`
}

// Businesses ...
type Businesses []Business

а также

package models

// Table ...
type Table struct {
    ID         uint
    Ref        string `gorm:"not null"`
    Business   Business
    BusinessID uint
}

// Tables ...
type Tables []Table

Это может быть очевидно из кода, но ассоциация должна заключаться в том, что один «бизнес» имеет много «таблиц», а «таблица» принадлежит «бизнесу». Однако при создании базы данных внешние ключи не создаются (я использую sqlite3), и когда я возвращаю бизнес, созданный с помощью

 bus := models.Business{
        Name: "Test",
        Tables: models.Tables{
        models.Table{Ref: "A1"},
    },
}
db.Create(&bus)

массив предприятий пуст, и когда таблица возвращается, хотя business_id правильный, бизнес-структура также пуста.


person Jacob Mason    schedule 29.05.2017    source источник


Ответы (1)


Я не смог воспроизвести вашу проблему. У меня есть рабочее решение. Я подозревал, что это не будет работать с объектами в отдельном пакете моделей, но это тоже сработало.

package main

import (
    "log"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
    _ "github.com/mattn/go-sqlite3"
)

type Business struct {
    ID     uint
    Name   string `gorm:"not null"`
    Tables Tables `gorm:"ForeignKey:BusinessID"`
}

type Table struct {
    ID         uint
    Ref        string `gorm:"not null"`
    Business   Business
    BusinessID uint
}

type Tables []Table
type Businesses []Business

func main() {
    var err error
    var db *gorm.DB

    db, err = gorm.Open("sqlite3", "test.db")
    if err != nil {
        log.Fatal(err)
    }

    defer db.Close()

    db.LogMode(true)
    db.AutoMigrate(&Business{})
    db.AutoMigrate(&Table{})

    bus := Business{
        Name: "Test",
        Tables: Tables{
            Table{Ref: "A1"},
        },
    }
    db.Create(&bus)
    var businesses Businesses
    db.Preload("Tables").Find(&businesses)
    log.Println(businesses)
}
person Ralph Juhnke    schedule 24.06.2017