#go #orm #m2m #beego
#Вперед #orm #m2m #beego
Вопрос:
У меня есть две модели:
type MainFields struct {
Id int `orm:"auto"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
}
type Game struct {
MainFields
Players []*Player `orm:"rel(m2m)"`
}
type Player struct {
MainFields
Games []*Game `orm:"reverse(many)"`
NickName string
}
И с помощью этого кода я пытаюсь создать новую игру с одним игроком:
func insertTestData() {
var playerA models.Player
playerA.NickName = "CoolDude"
id, err := models.ORM.Insert(amp;playerA)
if err != nil {
log.Printf(err.Error())
} else {
log.Printf("Player ID: %v", id)
}
var game models.Game
game.Players = []*models.Player{amp;playerA}
id, err = models.ORM.Insert(amp;game)
if err != nil {
log.Printf(err.Error())
} else {
log.Printf("Game ID: %v", id)
}
}
Но это просто создает две вставки для game и player без подключения к сети через таблицу «game_players», которая создается автоматически orm.RunSyncdb()
.
2016/09/29 22:19:59 Player ID: 1
[ORM]2016/09/29 22:19:59 -[Queries/default] - [ OK / db.QueryRow / 11.0ms] - [INSERT INTO "player" ("created", "updated", "nick_name") VALUES ($1, $2, $3) RETURNING "id"] - `2016-09-29 22:19:59.8615846 1000 VLAT`, `2016-09-29 22:19:59.8615846 1000 VLAT`, `CoolDude`
2016/09/29 22:19:59 Game ID: 1
[ORM]2016/09/29 22:19:59 -[Queries/default] - [ OK / db.QueryRow / 11.0ms] - [INSERT INTO "game" ("created", "updated") VALUES ($1, $2) RETURNING "id"] - `2016-09-29 22:19:59.8725853 1000 VLAT`, `2016-09-29 22:19:59.8725853 1000 VLAT`
Я не могу найти никаких специальных правил для работы с m2m-моделями в документах и прошу помощи у сообщества. Как мне вставить новую строку в таблицу?
Ответ №1:
В соответствии с этим вы должны создать объект m2m после создания объектной игры, например:
m2m := models.ORM.QueryM2M(amp;game, "Players")
И вместо game.Players = []*models.Player{amp;playerA}
, вы пишете:
num, err := m2m.Add(playerA)
Итак, ваша функция должна выглядеть следующим образом:
func insertTestData() {
var playerA models.Player
playerA.NickName = "CoolDude"
id, err := models.ORM.Insert(amp;playerA)
if err != nil {
log.Printf(err.Error())
} else {
log.Printf("Player ID: %v", id)
}
var game models.Game
id, err = models.ORM.Insert(amp;game)
if err != nil {
log.Printf(err.Error())
} else {
log.Printf("Game ID: %v", id)
}
m2m := o.QueryM2M(amp;game, "Players")
num, err := m2m.Add(playerA)
if err == nil {
log.Printf("Added nums: %v", num)
}
}
Надеюсь, это поможет.
PS: Кстати, вы были правы, не было необходимости указывать имя таблицы m2m.