2016-12-08 12 views
0

Я пишу мое первое приложение в golang, так что извините за вопрос новичка, но я не смог найти решение следующей задачи:Golang Горм поджимать

У меня есть две таблицы, положение и приложение. Каждая позиция может иметь несколько вложений. Вот моя модель:

type Positions struct { 
    Sys_id  int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id,omitempty"` 
    Name string `gorm:"size:120" gorm:"column:name" json:"name,omitempty"` 
    OpenPositions int `gorm:"column:open_positions" json:"open_positions,omitempty"` 
    ContactList string `gorm:"size:1000" gorm:"column:contact_list" json:"contact_list,omitempty"` 
    Attachments []Attachment `gorm:"ForeignKey:RecordId"` 
} 

type Attachment struct { 
    Sys_id  int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id"` 
    Name string `gorm:"size:255" gorm:"column: name" json:"name"` 
    File string `gorm:"size:255" gorm:"column:file" json:"file"` 
    RecordId int `gorm:"column:record_id" json:"record_id"` 
    Table string `gorm:"size:255" gorm:"column:table" json:"table"` 
    // ... 
} 

Я хочу, чтобы запросить БД и получить позиций с вложения

positions2 := []models.Positions{} 
err := db.Where("open_positions > ?", 0).Preload("Attachments", "`table` = ?", "user_position").Find(&positions2) 
if err != nil { 
    log.WithFields(log.Fields{ 
     "type": "queryerr", 
     "msg": err, 
    }).Error("faked up query") 
} 

Результат этого запроса - я получаю позиции правильно, но вложения являются пустыми.

(не может поджать поля для прикрепления models.Positions) уровень = ошибка MSG = "подделать до запроса" MSG = & {0xc04200aca0 не может поджать поля Оснастка для models.Positions 6 0xc042187e40 0xc042187d90 0xc0422cd4a0 0 { 0xc042225130} ложная карта [] карта [] ложь}

заранее спасибо за помощь

ответ

0

Похоже, не о Go или Горм, но о SQL.

W3Schools:

внешним ключом в одной таблице указывает на первичный ключ в другой таблице.

Но RecordId не является основным ключом для вашей модели. Пусть внешний ключ относится к первичному ключу. Его следует исправить следующим образом:

RecordId int `gorm:"column:record_id" gorm:"primary_key" json:"record_id"` 
0

Модели в вашем примере имеют пользовательские имена первичных столбцов. Итак, когда только ForeignKey установлен для ассоциации has_many, Gorm пытается найти столбец Position's Attachment.RecordId. По умолчанию для этого используется префикс Position и Id как имя столбца. Но ни столбец RecordId имеет префикс Position, ни Position model не имеет идентификатора столбца, поэтому он терпит неудачу.

В таком случае для ассоциации «has_many» следует указать как внешний ключ, так и внешний ключ ассоциации.

В вашем примере внешний ключ ассоциации - столбец Position.Sys_id и Attachment.RecordId ссылается на него.

Так оно и должно быть исправлено только путем добавления ассоциации внешнего ключа:

Attachments []Attachment `gorm:"ForeignKey:RecordId;AssociationForeignKey:sys_id"`