📜  adonisjs 多对多创建支点 - Javascript (1)

📅  最后修改于: 2023-12-03 15:13:16.784000             🧑  作者: Mango

AdonisJS 多对多创建支点

在 AdonisJS 中,支点(Pivot)是指用于连接多对多关系的中间表。支点表中除了关联的两个表的外键,通常还会包含一些额外的信息(例如创建时间、修改时间等)。

在本教程中,我们将介绍在 AdonisJS 中如何创建和使用多对多支点。

创建多对多关系

我们首先需要定义两个模型之间的多对多关系。假设我们有两个模型:UserRole。一个用户可以拥有多个角色,而一个角色可以被多个用户拥有。为了建立这种多对多关系,我们可以通过在 UserRole 模型之间定义 belongsToMany 关系来实现。

首先我们需要在 User 模型中定义 roles 关系:

class User extends Model {
  roles() {
    return this.belongsToMany('App/Models/Role').pivotTable('role_user')
  }
}

接下来我们在 Role 模型中定义 users 关系:

class Role extends Model {
  users() {
    return this.belongsToMany('App/Models/User').pivotTable('role_user')
  }
}

这里我们使用了 pivotTable 方法来指定支点表的名称为 role_user

创建支点表迁移

接下来,我们需要创建一个迁移来创建 role_user 表,该表将用作用户和角色之间的中间连接点。我们可以使用以下命令创建一个新的迁移文件:

adonis make:migration create_role_user_table --table=role_user

在迁移文件中,我们需要定义 role_user 表的结构:

class CreateRoleUserTable extends Migration {
  async up () {
    this.create('role_user', (table) => {
      table.increments()
      table.integer('role_id').unsigned().references('id').inTable('roles')
      table.integer('user_id').unsigned().references('id').inTable('users')
      table.timestamps()
    })
  }

  async down () {
    this.drop('role_user')
  }
}

在上面的代码中,我们定义了一个 role_user 表,该表包含一个自增 ID、一个指向 roles 表的外键、一个指向 users 表的外键和创建/更新时间戳字段。

插入数据到支点表

现在数据模型和支点表都已设置好,我们可以通过以下方式将用户和角色之间的联系插入到 role_user 表中:

const user = await User.find(1)
const role = await Role.find(1)

await user.roles().attach([role.id])

使用 attach 方法可以将给定的角色 ID 与该用户相关联。

检索数据

我们可以使用 attachdetachsync 方法来管理 role_user 表中的记录。例如,以下代码将从 role_user 表中删除一个用户和一个角色之间的关系:

await user.roles().detach([role.id])

我们也可以通过查询 Role 模型来检索拥有特定角色的所有用户:

const role = await Role.find(1)
const users = await role.users().fetch()
总结

通过 AdonisJS 的支点功能,我们可以方便地处理多对多关系。在本教程中,我们学习了如何创建多对多关系、支点表迁移和向支点表中插入数据和检索数据。这些基础知识可以大大提高我们的开发效率和代码质量。