【问题标题】:Insert for model with m2m in beego orm在beego orm中插入m2m模型
【发布时间】:2016-09-30 01:14:13
【问题描述】:

我有两个模型:

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(&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”表为游戏和玩家创建了两个没有关联的插入。

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`

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

【问题讨论】:

    标签: go orm m2m beego


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多