sequelize 多个外键
时间: 2023-10-22 13:06:28 浏览: 196
Sequelize 支持在一个模型中定义多个外键。下面是一个示例,假设我们有两个模型,一个是 `User` 模型,另一个是 `Task` 模型。每个任务都是由一个用户分配给另一个用户的,我们想要在任务中记录分配者和接收者的用户 ID。我们使用 Sequelize 的 `belongsTo()` 方法来定义这种关系。
```javascript
// User 模型定义
const User = sequelize.define('user', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
}
});
// Task 模型定义
const Task = sequelize.define('task', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: DataTypes.STRING,
allowNull: false
},
description: {
type: DataTypes.TEXT,
allowNull: false
},
assignerId: { // 分配者 ID
type: DataTypes.INTEGER,
allowNull: false
},
assigneeId: { // 接收者 ID
type: DataTypes.INTEGER,
allowNull: false
}
});
// User 和 Task 之间的关联关系
Task.belongsTo(User, {
foreignKey: 'assignerId',
as: 'assigner'
});
Task.belongsTo(User, {
foreignKey: 'assigneeId',
as: 'assignee'
});
// 创建任务并分配给用户的示例
const assigner = await User.create({
name: 'John Doe',
email: 'johndoe@example.com'
});
const assignee = await User.create({
name: 'Jane Doe',
email: 'janedoe@example.com'
});
const task = await Task.create({
title: 'Sample Task',
description: 'This is a sample task',
assignerId: assigner.id,
assigneeId: assignee.id
});
const taskWithAssignerAndAssignee = await Task.findOne({
where: { id: task.id },
include: ['assigner', 'assignee']
});
console.log(taskWithAssignerAndAssignee.assigner); // 获取分配该任务的用户实例
console.log(taskWithAssignerAndAssignee.assignee); // 获取接收该任务的用户实例
```
在上面的示例中,我们在 `Task` 模型中定义了两个外键,一个是 `assignerId`,用于记录分配者的用户 ID,另一个是 `assigneeId`,用于记录接收者的用户 ID。我们使用 `belongsTo()` 方法将这两个外键与 `User` 模型关联起来,并为它们分别指定一个名为 `assigner` 和 `assignee` 的访问器方法。在创建任务时,我们使用 `assigner.id` 和 `assignee.id` 将任务分配给指定的用户。在查询任务时,我们使用 `include` 选项将该任务的分配者和接收者一起获取,并使用访问器方法 `assigner` 和 `assignee` 访问这两个用户实例。
阅读全文