什么是"正确"实现平稳的方式#34;使用sequelize N:M关联的结果

时间:2015-10-15 17:55:08

标签: node.js orm sequelize.js

我有一个产品数据库,其中包含一些具有1-n类别的产品。我的产品存储在products表中,类别位于categories中,关联存储在productCategoryRel中。现在我的愿望是,当我使用Product.find()获取产品时,接收包含categories属性的结果,其中包含来自categories表的数据,而没有任何其他嵌套属性。< / p>

目前这是我到目前为止所得到的:

{
  "id": 1,
  "title": "Testproduct",
  "categories": [
    {
      "id": 1,
      "title": "Testcategory",
      "productCategoryRel": {
        "category_id": 1,
        "product_id": 1
      }
    }
  ]
}

因此我的product包含一个很好的属性categories,但categories还包含productCategoryRel表中我想要避免的所有数据。我已经谷歌搜索过地狱,研究了文档和诸如此类的东西,我不确定它是否有可能实现我想要的目标。

这是我定义我的(测试)模型的方式:

let ProductCategoryRel = sequelize.define('productCategoryRel', {});

let Category = sequelize.define('category', {
    title: Sequelize.STRING
});

let Product = sequelize.define('product', {
    title: Sequelize.STRING
}, {
    defaultScope: {
        include: [{
            model: Category
        }]
    }
});

和协会:

Product.belongsToMany(Category, {
    through: ProductCategoryRel,
    foreignKey: 'product_id',
});

Category.belongsToMany(Product, {
    through: ProductCategoryRel,
    foreignKey: 'category_id',
});

ProductCategoryRel.hasMany(Product, {foreignKey: 'id'});
ProductCategoryRel.hasMany(Category, {foreignKey: 'id'});

我想要的结果就像:

{
  "id": 1,
  "title": "Testproduct",
  "categories": [
    {
      "id": 1,
      "title": "Testcategory"
    }
  ]
}

这甚至可能吗?我如何需要改变我的联想?我已经尝试了一些奇怪的hasMany / belongsTo组合,但没有成功。

我正在使用Sequelize 3.12.1。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情(可能会有一些错误,但如果你给我反馈,我们会解决问题):

Product.findOne({
    where: {
      id: yourProductId
    },
    include: [{
      model : Category,
      order: [['id','desc']],
      through: {attributes: []}
    }],
  })

attributes属性允许您选择要显示的数据。它也可以用在包含的模型中。

更多文档http://docs.sequelizejs.com/en/latest/docs/querying/