首页 > 解决方案 > 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 不会作为外键生成。还请验证这里提到的关系(一对多)是否正确。

请验证我的代码,如果需要任何更改,请给我任何建议。我是开发新手

标签: node.jspostgresqlsequelize.js

解决方案


您的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
}

推荐阅读