2016-01-07 13 views
7

Questo è il mio schema db:Gorm molti a molti Selezionare dà associazione non valida [] errore

utenti:

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

languages:

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

user_languages:

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

Questo è il mio codice:

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 
} 

mi aspetto questo risultato:

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

Ma io sono sempre invalid association [] su console, l'aggiunta di un registratore di Gorm non ha fornito ulteriori informazioni.

Anche se posso solo ottenere un oggetto "lingue" come un array di nomi di lingue, questo è anche bene:

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

non 'db.Model (e utenti) .Related (e lingue)' devono essere 'db .Model (e utente) .Related (user.languages) '? Voglio dire, anche se quell'istruzione ha avuto successo, l'oggetto utente che hai restituito avrebbe una matrice di lingue vuota poiché non le hai mai assegnate, solo alla variabile locale. – evanmcdonnal

risposta

1

Credo che è necessario utilizzare Association. È inoltre possibile ottenere più rapidamente l'utente corrispondente utilizzando 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

Puoi spiegare che usi 'Association' invece di' Relation'? – mantal

+1

Per quanto ne so, "Association" è solo il nome delle relazioni in Gorm. La pagina dei documenti è abbastanza buona per farsi un'idea su: http://jinzhu.me/gorm/associations.html –

7

Si può provare:

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

Più esempi possono essere trovare nella test

+0

Questo stile ha funzionato per me. – Ducain

+1

Quindi questo ha funzionato anche per me, ma la documentazione sul sito web gorm non dice che devi specificare la chiave esterna. In effetti ho specificato i tag ForeignKey e AssociationForeignKey nella mia struct definition e ancora non ha funzionato senza aggiungere esplicitamente il nome della colonna nell'API 'Related' ... – Dina