序列化多个外键

Sequelize multiple foreignKey

我有表“交易”和“用户” 所以用户可以进行多次交易。

用户可以是买家或卖家。

我正在尝试像这样在 sequelize 中定义它

在交易中

Trades.associate = models => {

    Trades.belongsTo(models.UserData, {
            targetKey: 'customId',
            as: 'buyer',
            foreignKey: 'buyerId'
    })
    Trades.belongsTo(models.UserData, {
            targetKey: 'customId',
            as: 'seller',
            foreignKey: 'sellerId'
    })
}

并在用户中

UserData.associate = models => {

    UserData.hasMany(models.Trades, {
        foreignKey: 'buyerId',
        sourceKey: 'customId'
    })
    UserData.hasMany(models.Trades, {
        foreignKey: 'sellerId',
        sourceKey: 'customId'
    })
}

当我在“用户”Table 中通过 customId 执行 findOne 并包含数据库“Trades”时,我想在用户是交易员和卖家时获得所有信息,但只有当用户是卖家时它才会给我.

        let user = await UserData.findOne({where:{
                customId: req.user.customId
            }, include: 'Trades'
        });

您必须为每个关系使用别名。 这是 link :https://sequelize.org/master/manual/assocs.html#defining-an-alias

但简单地说,您必须执行以下操作:

UserData.hasMany(models.Trades, {
        foreignKey: 'buyerId',
        sourceKey: 'customId',
        as: 'Buyer'
    })
    UserData.hasMany(models.Trades, {
        foreignKey: 'sellerId',
        sourceKey: 'customId',
        as: 'Seller'
    })

然后,当您包括:

let user = await UserData.findOne({where:{
                customId: req.user.customId
            }, include: ['Seller', 'Buyer']
        });

您也可以要求 Sequelize 基于关联而不是模型进行包含:

include: [
{ association: Trades.associations.Seller }
]

PS:在文档中,他们不会将数组传递给 include,但在我使用 typescript 的版本中,必须这样做。所以我让你管理那一点!