我有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做错了什么吗?还是无法实现?
答案 0 :(得分:3)
在include
/ create
中使用build
意味着我们要向包含的表中插入记录。因此,以下包括意味着应将记录插入表B:
include:[
{ as:'Bs',required:true,model:models.B},
]
由于数据库中已经存在B值,因此仅应将这些值添加到A
和AB
中,所以需要的是:
A
和AB
表之间添加关联。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'
}]
});