📅  最后修改于: 2023-12-03 15:13:16.784000             🧑  作者: Mango
在 AdonisJS 中,支点(Pivot)是指用于连接多对多关系的中间表。支点表中除了关联的两个表的外键,通常还会包含一些额外的信息(例如创建时间、修改时间等)。
在本教程中,我们将介绍在 AdonisJS 中如何创建和使用多对多支点。
我们首先需要定义两个模型之间的多对多关系。假设我们有两个模型:User
和 Role
。一个用户可以拥有多个角色,而一个角色可以被多个用户拥有。为了建立这种多对多关系,我们可以通过在 User
和 Role
模型之间定义 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 与该用户相关联。
我们可以使用 attach
、detach
和 sync
方法来管理 role_user
表中的记录。例如,以下代码将从 role_user
表中删除一个用户和一个角色之间的关系:
await user.roles().detach([role.id])
我们也可以通过查询 Role
模型来检索拥有特定角色的所有用户:
const role = await Role.find(1)
const users = await role.users().fetch()
通过 AdonisJS 的支点功能,我们可以方便地处理多对多关系。在本教程中,我们学习了如何创建多对多关系、支点表迁移和向支点表中插入数据和检索数据。这些基础知识可以大大提高我们的开发效率和代码质量。