我正在尝试对具有多个关系的对象执行更新。其中一个关系是多对多的,我使用product.setCategories([categories])
来设置/更新它们:
var p = req.product;
var cIds = [];
return models.sequelize.transaction(function (t) {
var promises = [];
//check if the product is supposed to have categories
if (req.body.categories) {
req.body.categories.forEach(function (c) {
cIds.push(c.id);
});
promises.push(models.category.findAll({
where: { id: { $in: cIds } },
transaction: t
}).then(function (categories) {
p.setCategories(categories, { through: 'productsCategories' });
}));
} else if (p.categories.length > 0) {
//delete existing categories
promises.push(p.setCategories([], { transaction: t, through: 'productsCategories' }));
}
/add some more queries to "promises" and:
return models.sequelize.Promise.all(promises);
}).then(function (result) {
res.json(result);
}).catch(function (error) {
respondError(res, error);
});
我试图在单个事务(“t”)中执行此操作,但由于我需要一个仅在从数据库中检索类别后执行的嵌套查询,因此我无法看到。
我可以在一次交易中完成吗?这是更新manyToMany的最佳方式吗?
我正在使用sequelize v3.23.3和Postgres。
答案 0 :(得分:1)
return models.sequelize.transaction(function (t) {
//check if the product is supposed to have categories
if (req.body.categories) {
req.body.categories.forEach(function (c) {
cIds.push(c.id);
});
return models.category.findAll({
where: { id: { $in: cIds } },
transaction: t
}).then(function (categories) {
p.setCategories(categories);
});
// OR
return p.setCategories(cIds)
} else if (p.categories.length > 0) {
//delete existing categories
return p.setCategories([], { transaction: t, through: 'productsCategories' });
}
});
如果您一次只执行一个操作 - 在这里您要么设置为数组,要么设置为空,您只需从if语句中的每个分支返回,无需以.all
结尾。如果您使用的是最近版本的续集,您也可以直接将cIds
传递给setCategories
。