2017-10-24 6 views
-1

モデルに関連付けを追加する最良の方法はありません。私は、次の構造体以下Go GORM many2Many issue

type Beer struct { 
     ID    uint  `json:"id"` 
    Name   string  `json:"name" gorm:"not null;" sql:"unique"` 
    Description string  `json:"description" gorm:"not null;"` 
    ImageURL  string  `json:"image_url"` 
    AlcoholContent float64 `json:"alcohol_content, default:0"` 
    Featured  bool  `json:"featured"` 
    BrewStart  time.Time `json:"brew_start"` 
    BrewEnd  time.Time `json:"brew_end"` 
    Brewers  []Brewer `gorm:"many2many:beer_brewers" json:"brewers"` 
} 

type Brewer struct { 
    ID  uint  `json:"id"` 
    FirstName string  `json:"first_name"` 
    LastName string  `json:"last_name"` 
    Title  string  `json:"title"` 
    Featured bool  `json:"featured"` 
    Beers  []Beer `gorm:"many2many:beer_brewers" json:"beers"` 
} 

を有する上記のブリューワー・テーブル内の重複醸造を作成しかし、私は

Beer{ 
    Name:   "some pale ale", 
    Description: "a description of some pale ale", 
    ImageURL:  "http://via.placeholder.com/350x150", 
    AlcoholContent: 4.5, 
    Featured:  false, 
    BrewStart:  utils.ParseTime("30-10-2017 13:00 (AEDT)"), 
    BrewEnd:  utils.ParseTime("14-11-2017 13:00 (AEDT)"), 
    Brewers: []Brewer{ 
     Brewer{FirstName: "john", LastName: "smith", Title: "bottle shaker", Featured: false}, 
     Brewer{FirstName: "joe", LastName: "bloggs", Title: "bottle maker", Featured: true}, 
    }, 
}, 
Beer{ 
    Name:   "some lager", 
    Description: "a description of some pale ale", 
    ImageURL:  "http://via.placeholder.com/350x150", 
    AlcoholContent: 4.5, 
    Featured:  false, 
    BrewStart:  utils.ParseTime("30-10-2017 13:00 (AEDT)"), 
    BrewEnd:  utils.ParseTime("14-11-2017 13:00 (AEDT)"), 
    Brewers: []Brewer{ 
     Brewer{FirstName: "john", LastName: "smith", Title: "bottle shaker", Featured: false}, 
     Brewer{FirstName: "joe", LastName: "bloggs", Title: "bottle maker", Featured: true}, 
    }, 
}, 

とDBを播種したデータの一例です。私の質問は、既に存在するBrewerを参照するのに、Brewerテーブルに別のBrewerアイテムを作成する最良の方法は何ですか?また、新しいBrewerをBeerコレクションに追加する最良の方法は何ですか?

おかげで、 ジャスティン

答えて

1

は、醸造と使用.append方法は、ビールに醸造を追加し、最初のビールを作成してみてください。

http://jinzhu.me/gorm/associations.html#association-mode

// Start Association Mode 
var user User 
db.Model(&user).Association("Languages") 
// `user` is the source, it need to be a valid record (contains primary key) 
// `Languages` is source's field name for a relationship. 
// If those conditions not matched, will return an error, check it with: 
// db.Model(&user).Association("Languages").Error 


// Query - Find out all related associations 
db.Model(&user).Association("Languages").Find(&languages) 


// Append - Append new associations for many2many, has_many, will replace current association for has_one, belongs_to 
db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN}) 
db.Model(&user).Association("Languages").Append(Language{Name: "DE"}) 
0

ないあなたはオプションとしてこれを考えた場合は必ず - より良い方法は、あなたのBeers.Brewers分野におけるビールのID(スライス)への参照を保持することであってもよいです。データがエンコードされると、これらのIDをフルフィールド値に変換することができます(カスタマイズされたマーシャリング関数を使用)。スピード/パフォーマンスの考慮事項がない限り、これは適切かもしれません。

+0

返信いただきありがとうございました。それは素晴らしいアイデアです。 – RuNpiXelruN

0

私はこれまで何をしたいのかを解明しました。

brewerr := Brewer{} 
    db.Where(&Brewer{FirstName: "justin"}).Find(&brewerr) 

beerr := Beer{} 
    db.Preload("Brewers").Where(&Beer{Name: "some lager"}).Find(&beerr).Association("Brewers").Append(&brewerr) 

それは私が最初にPreloadBeer.Brewersコレクションに必要とTHEN追加ことに注意することが重要だ、私は下記行うために必要なBeer.Brewersコレクションに新しいBrewerを追加します。 Preloadに失敗した場合、その結果の上書きは、Brewersのすべてを上書きしましたBeer

関連する問題