【问题标题】:How to update the junction table with user's role in Adonis如何使用 Adonis 中的用户角色更新联结表
【发布时间】:2018-11-12 00:17:36
【问题描述】:

我有一个包含三个表的数据库:usersgamesgame_userusersgamesgame_user作为其连接表有多对多关系

game_user 表只有三列(id 除外):game_iduser_idgame_admin

这个想法是user 可以是gameadmin 中的普通用户。例如,我会为前者存储值0,为后者存储1

我不确定如何在 Adonis 中执行此操作。我已经阅读了文档,也许我应该创建一个pivotModel,但我不知道该怎么做(或者如果我应该这样做的话)。

我尝试了以下方法:

class GameUserSchema extends Schema {
  up () {
    this.create('game_user', (table) => {
      table.increments()
      table.integer('user_id').unsigned().index('user_id')
      table.integer('game_id').unsigned().index('game_id')
      table.integer('game_admin').unsigned().index('game_admin')
      table.foreign('user_id').references('users.id')
                                            .onDelete('cascade')
      table.foreign('game_id').references('games.id')
                                            .onDelete('cascade')
    })
  }

  down () {
    this.drop('game_user')
  }
}

现在,当我添加游戏时,我通常使用以下代码:

const newGame = await Game.create(gameData)
await user.games().attach([newGame.id])

但这只会使用user_id 更新联结表,显然,不会使用用户的角色。

所以我的问题是:我的迁移文件是正确的还是有更好的方法?另外,创建游戏时如何更新联结表?

【问题讨论】:

  • 数据透视表标签用于将行转换为列,而不是连接表的别名。一些 ORM 将联结表称为数据透视表,这让许多开发人员感到困惑。使用前请阅读标签说明。
  • 好的,很抱歉,但我认为标签可以更新,或者创建一个新标签,因为“一些 ORM 将连接表称为数据透视表”。只是我的两分钱,但它没有改变问题(除了一些单词选择。感谢您的更正。
  • 或者您可以要求您选择的 ORM 背后的人停止将联结表称为数据透视表...数据透视表标签定义很好,添加此引用会使用户感到困惑。在收到提示后,您设法为您的问题找到了正确的标签。

标签: javascript mysql many-to-many junction-table adonis.js


【解决方案1】:

要更新关联表的额外属性,您应该使用数据透视模型 这是您可以用作附加方法的回调的东西

await user.games().attach(games, (row) => {
   row.game_admin = 1 
})

【讨论】:

  • 对于枢轴模型的另一件事,必须更改架构,在这种情况下,表名将变为 game_users
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-12-19
相关资源
最近更新 更多