是否可以在单个事务中的sequelize中使用条件承诺执行嵌套查询?

时间:2016-07-07 17:05:23

标签: sequelize.js

我正在尝试对具有多个关系的对象执行更新。其中一个关系是多对多的,我使用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。

1 个答案:

答案 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