如果关系使用“as”,则属性与模型无关

时间:2017-04-13 02:43:22

标签: sequelize.js

数据库:mysql 5.5

Sequelize版本:3.30.4

用户角色模型

sequelize.define('userRole', {
    uid: {
      type: DataTypes.UUID,
      primaryKey: true
    },
    name: {
      type: DataTypes.STRING,
      unique: true
    }
  },
    {
      freezeTableName: false,
      tableName: 'user_roles'
    }
  )

用户模型

sequelize.define('user', {
    uid: {
      type: DataTypes.UUID,
      primaryKey: true
    },
    login: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false
    }
  },
    {
      freezeTableName: false,
      tableName: 'users'
    }
  )

和关系

Users.belongsTo(UserRoles, { as: 'role' })

尝试插入新用户

Users.create({
    uid: uuid(),
    login: 'login',
    password: 'password',
    role: {
      uid: uuid(),
      name: 'admin'
    }
  }, {
      include: [Types.UserRoles]
    })
  

错误:userRole未与用户关联!

试图使用

role: {
      uid: uuid(),
      name: 'admin'
    }

userRole: {
      uid: uuid(),
      name: 'admin'
    }

但没有区别

如果我改变与

的关系
Users.belongsTo(UserRoles)

一切都很好

2 个答案:

答案 0 :(得分:1)

在定义与as选项的关系时,您需要记住在执行查询时包含别名,并急切加载这些关系,因此您需要更改create()并添加{{1} } as中的选项:

include

答案 1 :(得分:1)

如果您在代码中使用sequelize.sync()而不是表Users,则会添加列UserRolesId

如果您不使用sequelize.sync(),则需要在表'users'中添加字段'roleId',然后描述

之类的关系
Users.belongsTo(UserRoles, {
  foreignKey: 'roleId',
  constraints: false, //is's optional
  as: 'post'
});

阅读额外的例子 - http://docs.sequelizejs.com/en/latest/docs/associations/