2016-04-10 31 views
0

我試圖在我的應用程序中字段(和db列)的名稱不相同的情況下創建「所屬」關係作爲類型名稱。格姆正在抱怨這一點。下面是一個說明問題的一個簡單的例子:無法創建與gorm的外鍵關係,其中字段名!=類型名稱

package main 

import (
    "fmt" 
    "github.com/jinzhu/gorm" 
    _ "github.com/mattn/go-sqlite3" 
) 

type Car struct { 
    gorm.Model 
    Owner User 
    OwnerID int 
} 

type User struct { 
    gorm.Model 
} 

func main() { 
    db, _ := gorm.Open("sqlite3", "test.db") 
    defer db.Close() 
    db.LogMode(true) 

    db.CreateTable(&Car{}, &User{}) 

    u := User{} 
    u.ID = 1 
    db.Create(&u) 

    c := Car{} 
    c.ID = 1 
    c.Owner = u 
    db.Create(&c) 

    cars := make([]Car, 5) 
    db.Find(&cars) 
    for i := range cars { 
     db.Model(cars[i]).Related(&cars[i].Owner) 
    } 

    for i := range cars { 
     fmt.Println(cars[i].Owner.ID) 
    } 
} 

我們希望這個程序打印出「1」作爲自己的最後一行,因爲這是用戶關係的主鍵「擁有」唯一的汽車在數據庫中。相反,「0」被打印出來,並詳細日誌記錄顯示錯誤在Related(&cars[i].Owner)步:

(/home/nate/gocode/src/foo/main.go:26) 
[2016-04-09 19:33:46] [122.35ms] CREATE TABLE "cars" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"owner_id" integer) 

(/home/nate/gocode/src/foo/main.go:26) 
[2016-04-09 19:33:46] [98.96ms] CREATE INDEX idx_cars_deleted_at ON "cars"(deleted_at) 

(/home/nate/gocode/src/foo/main.go:26) 
[2016-04-09 19:33:46] [108.95ms] CREATE TABLE "users" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime) 

(/home/nate/gocode/src/foo/main.go:26) 
[2016-04-09 19:33:46] [125.74ms] CREATE INDEX idx_users_deleted_at ON "users"(deleted_at) 

(/home/nate/gocode/src/foo/main.go:30) 
[2016-04-09 19:33:46] [0.53ms] INSERT INTO "users" ("id","created_at","updated_at","deleted_at") VALUES ('1','2016-04-09T19:33:46-04:00','2016-04-09T19:33:46-04:00','<nil>') 

(/home/nate/gocode/src/foo/main.go:35) 
[2016-04-09 19:33:46] [1.98ms] UPDATE "users" SET "created_at" = '2016-04-09T19:33:46-04:00', "updated_at" = '2016-04-09T19:33:46-04:00', "deleted_at" = '<nil>' WHERE "users".deleted_at IS NULL AND "users"."id" = '1' 

(/home/nate/gocode/src/foo/main.go:35) 
[2016-04-09 19:33:46] [0.43ms] INSERT INTO "cars" ("id","created_at","updated_at","deleted_at","owner_id") VALUES ('1','2016-04-09T19:33:46-04:00','2016-04-09T19:33:46-04:00','<nil>','1') 

(/home/nate/gocode/src/foo/main.go:38) 
[2016-04-09 19:33:46] [0.64ms] SELECT * FROM "cars" WHERE "cars".deleted_at IS NULL 

(/home/nate/gocode/src/foo/main.go:40) 
[2016-04-09 19:33:46] invalid association [] 
0 

這到底是怎麼回事?是否在Owner字段中使用了一些特殊標籤?我試過使用gorm:"ForeignKey:owner_id"gorm:"AssociationForeignKey:owner_id",兩者都給出了相同的結果。

回答

0

在你的情況最簡單的方法是指定外國的字段名稱。所以,你的

db.Model(cars[i]).Related(&cars[i].Owner) 

應該像

db.Model(cars[i]).Related(&cars[i].Owner, "Owner") 

兩種方式是

  • 重命名OwnerOwnerID領域UserUserID
  • 重命名User結構Owner

在這些情況下,GORM會自動選擇正確的外鍵。從GORM documentation about associations

如果字段名稱與變量的類型名稱相同,則可以省略。

+0

真的沒有自動的方式來做到這一點與標籤,我必須每次指定密鑰? –

+0

@NateMara https://github.com/jinzhu/gorm/blob/master/scope.go#L962我看到只有一種方法可以實現自動化 - 在子模型之後命名您的字段。 –

相關問題