在beego orm中插入具有m2m的模型 [英] Insert for model with m2m in beego orm

查看:118
本文介绍了在beego orm中插入具有m2m的模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:

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
}

使用此代码,我试图与一个玩家创建新游戏:

And with this code i`am trying to create new game with one player:

func insertTestData() {
    var playerA models.Player
    playerA.NickName = "CoolDude"
    id, err := models.ORM.Insert(&playerA)
    if err != nil {
        log.Printf(err.Error())
    } else {
        log.Printf("Player ID: %v", id)
    }

    var game models.Game
    game.Players = []*models.Player{&playerA}
    id, err = models.ORM.Insert(&game)
    if err != nil {
        log.Printf(err.Error())
    } else {
        log.Printf("Game ID: %v", id)
    }

}

但是它只是为游戏和玩家创建了两个插入内容,而没有通过orm.RunSyncdb()自动创建的"game_players"表进行相关连接.

But it just create two inserts for game and player without rel-connection through "game_players" table which created automatically with 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模型的任何特殊规则并寻求社区的帮助.我应该如何在表格中插入新行?

I can`t find any special rules for working with m2m-models in docs and ask for help to community. How should i insert new row in table?

推荐答案

根据

According to this, you have to make a m2m object, after creating object game, like this:

m2m := models.ORM.QueryM2M(&game, "Players")

而不是game.Players = []*models.Player{&playerA},而是这样写:

num, err := m2m.Add(playerA)

因此,您的函数必须如下所示:

So, your function must look like this:

func insertTestData() {
    var playerA models.Player
    playerA.NickName = "CoolDude"
    id, err := models.ORM.Insert(&playerA)
    if err != nil {
        log.Printf(err.Error())
    } else {
        log.Printf("Player ID: %v", id)
    }

    var game models.Game
    id, err = models.ORM.Insert(&game)
    if err != nil {
        log.Printf(err.Error())
    } else {
        log.Printf("Game ID: %v", id)
    }

    m2m := o.QueryM2M(&game, "Players")
    num, err := m2m.Add(playerA)
    if err == nil {
        log.Printf("Added nums: %v", num)
    }
}

我希望这会有所帮助.

P.S .:顺便说一句,您是对的,没有必要指定m2m表的名称.

P.S.: BTW, you were right, It wasn't necessary to specify the name of the m2m table.

这篇关于在beego orm中插入具有m2m的模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆