在beego orm中插入m2m的模型

时间:2016-09-29 12:30:47

标签: go orm m2m beego

我有两种模式:

onCloseDocument()

使用此代码,我试图与一名玩家一起制作新游戏:

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
}

但它只为游戏和玩家创建了两个插件,而没有通过" game_players"使用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()

我找不到在docs中使用m2m-models的任何特殊规则,并向社区寻求帮助。我该如何在表中插入新行?

1 个答案:

答案 0 :(得分:0)

根据this,你必须在创建对象游戏后创建一个m2m对象,如下所示:

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

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

num, err := m2m.Add(playerA)

所以,你的功能必须如下:

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表的名称。