go - 在 beego orm 中插入带有 m2m 的模型

标签 go 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(&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”表为游戏和玩家创建了两个没有 rel 连接的插入。

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 模型的任何特殊规则并向社区寻求帮助。我应该如何在表格中插入新行?

最佳答案

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

关于go - 在 beego orm 中插入带有 m2m 的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39770411/

相关文章:

尽管使用了 java.NIO,但 Java Websockets 的可扩展性很差

go - 如何快速构建/安装交叉编译的嵌套包?

java - 分离的实体传递到持久化 : model. 公司

Django 信号 m2m_changed 未触发

go - 在结构映射中实现结构集

json - Marshal/Unmarshal int 类型

php - 在 Laravel Eloquent 中使用 “With()” 函数获取特定列

ruby-on-rails - Rails 中的 Active Record 和 ORM 有什么区别?

Django,在 self 类内的多对多关系中,我如何在ORM方面相互引用?

django - 复制 django 模型实例的所有字段