什么是“正确”的方式来实现一个“平坦”的结果使用序列化N:M协会
我有一个产品数据库,其中包含一些具有1-n类别的产品。 我的产品存储在products
表中,类别在categories
,关联存储在productCategoryRel
。 现在我的愿望是,当我使用Product.find()
获取一个产品时,接收一个包含categories
属性的结果,其中包含categories
表中的数据,没有任何其他嵌套属性。
目前这是我到目前为止:
{ "id": 1, "title": "Testproduct", "categories": [ { "id": 1, "title": "Testcategory", "productCategoryRel": { "category_id": 1, "product_id": 1 } } ] }
所以我的product
包含一个很好的属性categories
,但categories
也包含我想要避免的来自productCategoryRel
表的所有数据。 我已经像地狱一样search,研究了文档和什么,我不确定是否甚至有可能实现我的目标。
这是我如何定义我的(testing)模型:
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。
尝试这样的事情(可能有一些错误,但如果你给我反馈,我们解决问题):
Product.findOne({ where: { id: yourProductId }, include: [{ model : Category, order: [['id','desc']], through: {attributes: []} }], })
attributes
属性允许你select要显示的数据。 它也可以用在包含的模型中。