2016-01-07 9 views
7

To jest mój schemat db:gorm wiele do wielu Select daje nieważne stowarzyszenie [] Błąd

użytkownicy:

id uuid PRIMARY KEY , title character 
"1234"     "ABCD" 

języki:

id uuid PRIMARY KEY , name character 
"1122"     "eng" 
"1133"     "man" 

user_languages:

user_id uuid, language_id uuid 
"1234"   "1122" 
"1234"   "1133" 

To jest mój kod:

type User struct { 
    Id   uuid.UUID `json:"id" gorm:"primary_key"` 
    Title  string  `json:"title"` 
    Languages []Language `json:"languages" gorm:"many2many:user_languages;"` 
} 

type Language struct { 
    ID uuid.UUID `json:"id" gorm:"primary_key"` 
    Name string `json:"name"` 
} 

func GetUser(id string) User { 
    user := User{} 
    languages := Language{} 

    db.Where("id = ?", id).Find(&user) 
    // SELECT * FROM users WHERE 'id' = id; 

    db.Model(&user).Related(&languages) 
    // SELECT * FROM "languages" INNER JOIN "user_languages" ON "user_languages"."language_id" = "languages"."id" WHERE "user_languages"."user_id" = 111 

    return user 
} 

Oczekuję ten wynik:

{ 
    "id": "1234", 
    "title": "ABCD", 
    "languages" : [{ 
       "id" : "1122", 
       "name" : "eng" 
      },{ 
       "id" : "1122", 
       "name" : "eng" 
      }] 
} 

Ale jestem coraz invalid association [] na konsoli, dodając rejestrator Gorm nie podał więcej informacji.

Nawet jeśli mogę dostać tylko „Języki” przedmiot podobny tablicy języków nazw, to też dobrze:

"languages" : ["eng", "man"] 
+1

Nie 'db.Model (i użytkownika) .Related (i języki)' 'muszą być db .Model (& user) .Related (user.languages) '? Chodzi mi o to, że nawet jeśli to stwierdzenie się powiedzie, zwracany obiekt użytkownika będzie miał pustą tablicę języków, ponieważ nigdy jej nie przypisujesz, tylko do zmiennej lokalnej. – evanmcdonnal

Odpowiedz

1

Myślę, że trzeba użyć Association. Możesz również uzyskać bardziej pasującego użytkownika, używając db.First(&user, id).

func GetUser(id string) User { 
    var user User 

    db.First(&user, id) 

    db.Model(&user).Association("Languages").Find(&user.Languages) 

    return user 
} 
+0

Czy możesz wyjaśnić, że używasz 'Association' zamiast' Relation'? – mantal

+1

O ile mi wiadomo, "Stowarzyszenie" jest po prostu nazwą relacji w Gorm. Strona z dokumentami jest całkiem niezła w przekręcaniu pomysłu: http://jinzhu.me/gorm/associations.html –

7

Możesz spróbować:

db.Model(&user).Related(&languages, "Languages") 

Więcej przykładów można znaleźć w test

+0

Ten styl działa dla mnie. – Ducain

+1

To też działało dla mnie, ale dokumentacja na stronie gorm nie mówi, że musisz określić klucz obcy. W rzeczywistości określiłem znaczniki ForeignKey i AssociationForeignKey w mojej definicji struct i nadal nie działało bez jawnego dodawania nazwy kolumny w API 'Related' ... – Dina