BelongsToMany关联并使用NodeJS Sequelize插入数据库

时间:2019-01-11 07:08:33

标签: node.js express sequelize.js

我有2个A和B类,3个表A,B和AB

A.belongsToMany(B,as:'Bs', through: models.AB) 
B.belongsToMany(A,as:'As', through: models.AB)

直到现在,这些关联仍无法获取包含B的A,反之亦然。

当我尝试创建A时,我正在发送包含所选B值的JSON。 我的JSON:

{
"name" : "A"
"Bs": [
        {"id_B" : 1},
        {"id_B" :2},
        {"id_B" :3}
    ]
}

我要插入行的代码是:

A= await models.A.build(req.body, 
           {
             transaction:transaction,
             include:[
                { as:'Bs',required:true,model:models.B},
             ]
           }
)

我期望的结果是,在AB表中使用提供的id和新创建的id_A来创建行,但是它正尝试在表B内创建行id_B,但由于其他属性而无法运行而失败为空。

我已经搜索了很长时间,并尝试了多种解决方案,我知道我能够通过两个步骤来做到这一点:

1)创建A

2)A.addB()

问题:

1)是否可以一步完成?

2)我的JSON做错了什么吗?还是无法实现?

1 个答案:

答案 0 :(得分:3)

include / create中使用build意味着我们要向包含的表中插入记录。因此,以下包括意味着应将记录插入表B:

include:[
            { as:'Bs',required:true,model:models.B},
        ]

由于数据库中已经存在B值,因此仅应将这些值添加到AAB中,所以需要的是:

  1. AAB表之间添加关联。
  2. AB / create语句中使用build

代码应如下所示:

A.belongsToMany(B, { through: AB, as: 'Bs', foreignKey: 'id_A' }); // Not relevant for this use case
B.belongsToMany(A, { through: AB, as: 'As', foreignKey: 'id_B' }); // Not relevant for this use case
A.hasMany(AB, { as: 'ABs', foreignKey: 'id_A'} );

const a = await A.create({ 
    id: 1,
    ABs: [{ id_B: 22 }]
}, {
    include: [{
        model: AB,
        as: 'ABs'
    }]
});