【问题标题】:Sequelize - How to setup foreign key and join on itSequelize - 如何设置外键并加入它
【发布时间】:2019-04-18 21:06:52
【问题描述】:

我有两张桌子;用户权限和权限项。 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 定义?

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

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    在您的 userPermissions 模型中, 而不是这个

    UserPermission.hasOne(PermissionItem);
    

    试试这个

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

    HasOne 和 BelongsTo 在不同模型中插入关联键 从彼此。 HasOne 在目标模型中插入关联键 而 BelongsTo 在源模型中插入关联键。

    【讨论】:

      【解决方案2】:

      我最终将 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' });
      

      【讨论】:

        【解决方案3】:

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

            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' }],
          });
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-29
          • 2020-07-09
          • 2013-02-24
          • 2019-12-26
          • 2021-11-02
          • 2011-11-15
          • 1970-01-01
          相关资源
          最近更新 更多