使用Sequelize为Node.js更新多对多关联表

3
我有一个产品表和一个分类表。一个产品可以有多个分类,一个分类也可以有多个产品。因此,我有一个ProductsCategories表来处理多对多关联。
在下面的示例中,我正在尝试将我的其中一个产品(具有ID为1的产品)与3个不同的分类(具有ID为1、2和3的分类)关联起来。从我得到的丑陋的SQL错误信息中可知,我的代码片段存在问题,因为我正在尝试将一个对象插入到ProductsCategories关联表中。我不知道如何修复下面的片段,或者我是否在正确的轨道上。Sequelize文档在这方面非常缺乏。
models.Product.find({ where: {id: 1} }).on('success', function(product) {
  models.Category.findAll({where: {id: [1,2,3]}}).on('success', function(category){
    product.setCategories([category]);
  });      
});

我非常希望能得到一些帮助,谢谢。另外,我正在使用Postgres,不确定这是否有影响。


我不喜欢数据库框架的一个原因是,这段代码似乎不能扩展。三条 SQL 语句可以用一条语句完成,为了满足 ORM,每个表的每列都要在数据库服务器和应用服务器之间传递。 - Brandon
2个回答

8

models.Category.findAll 返回一个数组。通过执行 setCategories([category]); 你将该数组包装在另一个数组中。尝试将其更改为 setCategories(category);


1
非常感谢你,Jan!我无法告诉你我浪费了多少时间来解决这个问题。我真的很感激你的帮助。 - wusauarus

1

我认为你很接近了。我的一些代码也遇到过类似的问题。尝试迭代你找到的类别,然后将它们相加。我认为这可能会起作用。

models.Category.findAll({where: {id: [1,2,3]}}).on('success', function(category){
            for(var i=0; i<category.length; i++){
                product.setCategories([category[i]]);
            }
      });  

嘿Rick,谢谢你的回应。我认为你所做的肯定行得通,但上面的解决方案更加简洁。无论如何都+1。 - wusauarus
1
我认为这不起作用,因为每次调用setCategories都会替换整个类别列表,换句话说,只有最后一个类别会获胜并被添加。 - Christoph
应该使用 product.addCategories(),因为这样可以正确地追加。 - Sgnl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接