Sequelize-如何设置外键并加入外键

时间:2018-11-15 17:29:10

标签: sequelize.js

我有两个桌子。 userPermissions和PermissionItems。 userPermissions具有一个PermissionItemId作为外键,定义为

CONSTRAINT `fk_userPermissions_permissionItemId`
  FOREIGN KEY (`permissionItemId`)
  REFERENCES `mydb`.`permissionItems` (`permissionItemId`)

他们的Sequelize定义是

const PermissionItem = db.define('permissionItems', {
  permissionItemId: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  }
});


const UserPermission = db.define('userPermissions', {
  userPermissionsId: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  permissionItemId: {
    type: Sequelize.INTEGER,
    references: 'permissionItems',
    referencesKey: 'permissionItemId'
  }
});
UserPermission.hasOne(PermissionItem);

然后我尝试将两者与一起使用,并使用来查看结果

UserPermission.findAll({
  include: [{
    model: PermissionItem
  }]
}).then(userPermission => {
  console.log('userPermission', userPermission);
});

我在这里的期望是获取所有UserPermissions的列表,以及对PermissionItemId的外部左连接PermissionItem。相反,我收到以下错误

  

未处理的拒绝SequelizeDatabaseError:未知列   “字段列表”中的“ permissionItem.userPermissionUserPermissionsId”

我构造的查询不正确吗?还是Sequelize的定义?

我尝试过将它们翻转并包括反向操作,并以我能想到的每种组合将键向后应用,但都无济于事

3 个答案:

答案 0 :(得分:0)

在您的userPermissions模型中, 代替这个

UserPermission.hasOne(PermissionItem);

尝试

UserPermission.belongsTo(PermissionItem,{foreignKey:'permissionItemId'});
  

HasOne和Belongs在不同模型中插入关联密钥   彼此。 HasOne将关联密钥插入目标模型   而BelongsTo将关联密钥插入源模型。

答案 1 :(得分:0)

我最终将UserPermission更改为以下内容。看起来我不需要为数据库中的现有外键在Sequelize模型中定义任何特殊的东西,只需要在hasOne调用中列出它

UserPermission = db.define('userPermissions', {
  userPermissionsId: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  permissionItemId: {
    type: Sequelize.INTEGER
  }
});
UserPermission.hasMany(PermissionItem, { foreignKey: 'permissionItemId', sourceKey: 'permissionItemId' });

答案 2 :(得分:0)

每当我想要建立关联时,通常都会在两个模型中都定义并分配别名,以便更好地理解和正确配置。

    orders.hasMany(models.orderDetails, { 
      as: 'orderDetails',
      foreignKey: 'orderId',
      targetKey: 'id', });

    orderDetails.belongsTo(models.Orders, {
      foreignKey: 'specialOrderId',
      targetKey: 'id',
      as: 'Orders'
    });

每当查询创建或查找:

    models.orders.create(ObjectToCreate, {
    include: [{ model: models.orderDeatils, as: 'orderDeatils' }],
  });


    models.orders.findAll({ where: { id: 3}}, {
    include: [{ model: models.orderDeatils, as: 'orderDeatils' }],
  });