2016-07-07 10 views
1

私はいくつかの関係を持つオブジェクトへの更新を実行しようとしています。これらの関係の一つは、多くの多くであると私は設定し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」)でそれをやろうとしましたが、私は、私は必要があるため、どのように見ることができませんデータベースからカテゴリを取得した後にのみ実行されるネストされたクエリ。

私は1回のトランザクションでそれを行うことはできますか?これはmanyToManyを更新する最良の方法ですか?

私はPostgresでsequelize v3.23.3を使用しています。

答えて

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で終了する必要を返すことはできませんが。続編の最新バージョンを使用している場合は、cIdssetCategoriesに直接転送することもできます。

+0

申し訳ありませんが、私は十分にはっきりしていないが、単純化のために約束のキューに追加されているいくつかの約束を削除したので、私は'all 'を放棄できないとは思わない。私は単純にids配列を追加することができますヒントありがとう、ありがとうございますが、私は条件付き約束とネストされたクエリを実行することができますまだ1つのトランザクションで続ける。私はできますか?ありがとうございます – belyid

+0

私はあなたが条件付き約束を意味するかどうか確かめていませんか?あなたは精緻化できますか? –

+0

オブジェクトを1回のトランザクションで更新したいとします。そのためには、コンテキストに応じて5〜10回の操作が必要です。私はクエリが必要かどうか(条件付き)を確認し、もしそうなら私はそれを約束[]に加えて、すべてを最後まで実行する。独立して実行できるのであれば問題ありませんが、他のクエリの中にネストする必要があるものはありません。 – belyid