node.js - Sequelize 与关联的外键
问题描述
我有一个使用 Postgres 创建的数据库,它是为单个外键关联设置的,现在,这将被映射为角色表模型考虑我有两个表 user 和 roles 角色包含角色详细信息,用户包含角色的用户详细信息
const uuid = require('uuid/v4');
('use strict');
module.exports = (sequelize, DataTypes) => {
const role = sequelize.define(
'role',
{
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.UUID,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
},
{}
);
role.beforeCreate((role) => (role.id = uuid()));
role.associate = function (models) {
role.hasMany(models.user), { foreignKey: 'roleId', as: 'user_roleId' };
};
return role;
};
role migration
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('roles', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
},
name: {
type: Sequelize.STRING,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('roles');
},
};
user model
const uuid = require('uuid/v4');
('use strict');
module.exports = (sequelize, DataTypes) => {
const user = sequelize.define(
'user',
{
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.UUID,
},
firstName: {
type: DataTypes.STRING,
allowNull: false,
},
lastName: DataTypes.STRING,
email: {
type: DataTypes.STRING,
allowNull: false,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
phoneNumber: {
type: DataTypes.STRING,
},
roleId: {
type: DataTypes.UUID,
},
},
{
timestamps: true,
paranoid: true,
defaultScope: {
attributes: { exclude: ['password'] },
},
}
);
user.beforeCreate((user) => (user.id = uuid()));
user.associate = function (models) {
user.belongsTo(models.role, { foreignKey: 'roleId', onDelete: 'CASCADE' });
};
return user;
};
user migration
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('users', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
},
firstName: {
type: Sequelize.STRING,
},
lastName: {
type: Sequelize.STRING,
},
email: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING,
},
phoneNumber: {
type: Sequelize.STRING,
},
roleId: {
type: Sequelize.UUID,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
deletedAt: {
allowNull: true,
type: Sequelize.DATE,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('users');
},
};
运行迁移后,这些表在我的数据库中创建。role_id 也存在于用户表中。但在我的用户表中,role_id 不会作为外键生成。还请验证这里提到的关系(一对多)是否正确。
请验证我的代码,如果需要任何更改,请给我任何建议。我是开发新手
解决方案
您的user
迁移还需要了解外键;您可以通过向references:
列定义添加一个键来执行此操作。Sequelize文档有一个外键示例;向下滚动页面大约一半(或仅搜索references
)。
在您的情况下,用户迁移应该类似于:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('users', {
// ... other fields omitted
roleId: {
type: Sequelize.UUID,
references: {
model: { tableName: 'role' }
key: 'id',
},
},
// ... more fields omitted
});
},
// down: omitted
}
推荐阅读
- angular - 无法绑定到 ngModel,因为它不是输入错误的已知属性
- r - 如何对公共变量而不是整个数据进行算术平均?
- r - 当行包含的元素多于数据框中的列时,将行添加到数据框中
- c++ - 为什么即使删除了复制构造函数,std::atomic 也会从 C++17 编译?
- android - SKU 项目在 subscriptionPeriod 字段中包含意外值
- python - 价格预测适用于未来一年,但不适用于明天
- python - 熊猫中的圆形和分组小时值
- java - 放心 json 数组有大小但为空的对象
- javascript - 将图像从 React 项目导入组件
- shell - 显示文本文件在给定字符处停止每一行