javascript - 翻转外键关系?

标签 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) => {
    ....
  },
};

如果我现在尝试插入一个具有新 Angular 色的用户:
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);
});

它尝试在 userid 中添加 Angular 色 uuid 并在 roleid 中添加用户 uuid .. 并且约束失败了......

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

最佳答案

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


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

我设置了错误的外键,它不是辅助表中的字段,它需要是源表(在本例中为用户模型的 uuid)或将其留空以便 sequelize 使用主键的默认行为。

关于javascript - 翻转外键关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52504654/

相关文章:

node.js - 错误: Cannot find module 'binary-extensions'

sequelize.js - this.getDataValue 不是函数 - 模型 sequelize v.5

JavaScript:通过 AJAX 下载和加载图表的脚本不起作用

javascript - 为什么日期时间选择器中的日期没有突出显示?

javascript - 如何在 javascript 中使用 Curl

javascript - 避免循环访问由 mongodb 和 express 生成的 URL

javascript - 仅使用没有 jquery 的 javascript 重新加载 div

javascript - Node 中的 Promise 不起作用 - .then 未定义

orm - 有条件地对allownull约束进行后续处理

node.js - 有时在发生 sequelize 错误时不发送响应(未处理的拒绝 SequelizeDatabaseError)