翻转外键关系?

时间:2018-09-25 18:29:54

标签: javascript node.js sequelize.js

我对m:n关系有一种奇怪的印象。 这是模型定义:

角色模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Role = sequelize.define('Role', {
    uuid: {
      allowNull: false,
      primaryKey: true,
      unique: true,
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
    },
    ....
  }, {});
  /** @param models.User */
  Role.associate = function(models) {
    Role.belongsToMany(
      models.User, {
        through: 'user_role',
        foreignKey: 'userId',
      }
    );
  };
  return Role;
};

用户模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    uuid: {
      allowNull: false,
      primaryKey: true,
      unique: true,
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
    },
    ....
  }, {});
  /** @param models.Role */
  User.associate = function(models) {
    User.belongsToMany(
      models.Role, {
        through: 'user_role',
        foreignKey: 'roleId',
      }
    );
  };
  return User;
};

迁移如下:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('user', {
      uuid: {
        allowNull: false,
        unique: true,
        primaryKey: true,
        type: Sequelize.UUIDV4,
        defaultValue: Sequelize.UUIDV4,
      },
      ....
    }).then(() => {
      queryInterface.createTable('role', {
        uuid: {
          allowNull: false,
          unique: true,
          primaryKey: true,
          type: Sequelize.UUIDV4,
          defaultValue: Sequelize.UUIDV4,
        },
        ....
      });
    }).then(() => {
      queryInterface.createTable('user_role', {
        userId: {
          type: Sequelize.UUIDV4,
          references: {
            model: 'User',
            key: 'uuid',
          },
          allowNull: false,
        },
        roleId: {
          type: Sequelize.UUIDV4,
          references: {
            model: 'Role',
            key: 'uuid',
          },
          allowNull: false,
        },
        ....
      });
    }).then(() => {
      return queryInterface.addConstraint('user_role', ['UserId', 'RoleId'], {
        unique: true,
        type: 'primary key',
        name: 'userrole_pkey',
      });
    });
  },
  down: (queryInterface, Sequelize) => {
    ....
  },
};

如果我现在尝试插入具有新角色的用户:

let models = require('../models');
models.Role.create({
  role: 'Administrator',
  description: 'Administrator Gruppe',
}).then(role => {
  models.User.create({
    login: 'admin',
    password: '123',
    nick: 'Admini',
    mail: 'admin@localhost.com',
  }).then(user => {
    user.addRole(role);
    user.save().then(() => {
      console.log('admin created');
    }).catch(err => {
      console.log(err);
    });
  }).catch(err => {
    console.log(err);
  });
}).catch(err => {
  console.log(err);
});

它试图在用户id中添加角色uuid,在角色id中添加用户uuid。为此,约束失败...

我犯错的任何提示或技巧?

1 个答案:

答案 0 :(得分:0)

我自己(在大学的帮助下)发现了错误

  models.User, {
    through: 'user_role',
    foreignKey: 'userId',
  }

我设置了错误的外键,这不是帮助程序表中的字段,它必须是源表(在这种情况下是用户模型的uuid),或者将其留空,以使sequelize的默认行为使用主键。 / p>