如何在具有多对多关系的查询中添加ID数组Sequelize

时间:2019-03-16 12:19:17

标签: node.js sequelize.js

我有2个实体,其中一个与n:m关系:

const Item = db.define('item', {
   id: {
       type: Sequelize.BIGINT,
       primaryKey: true,
       autoIncrement: true,
   },

   title: Sequelize.STRING,
   description: Sequelize.STRING,

   price: {
       type: Sequelize.FLOAT,
       defaultValue: 0.0,
   },
});

const Category = db.define('category', {
   id: {
       type: Sequelize.BIGINT,
       primaryKey: true,
       autoIncrement: true,
   },
   title: Sequelize.STRING,
});

const ItemCategory = db.define('item_category', { 
   id: {
     type: Sequelize.BIGINT,
     primaryKey: true,
     autoIncrement: true,
   },
   category_id: {
     type: Sequelize.BIGINT
   },
   item_id: {
     type: Sequelize.BIGINT
   }
});

与关系:

Category.belongsToMany(Item, { 
  through: {
    model: ItemCategory,
    unique: false
  },
  foreignKey: 'category_id',
  constraints: false
});

Item.belongsToMany(Category, { 
   through: {
     model: ItemCategory,
     unique: false
   },
   foreignKey: 'item_id',
   constraints: false
});

协会运作良好(我想)。但是,当我尝试查询Item时,结果没有类别字段。 另外,我可以添加include选项,它返回类别对象:

Item.findAll({ include: [{ model: Category }] })

问题是:如何在查询Item对象时仅关联category_ids作为响应:

{
   id: 1,
   categories_ids: [1,3,4],
   price: 20
}

2 个答案:

答案 0 :(得分:1)

尝试类似的方法 将您的贯穿模型也直接关联到商品,因此您可以将其包含在查询中

Item.hasMany(ItemCategory, { 
   foreignKey: 'item_id',
   constraints: false
});

Item.findAll({ 
 include: [{
  model: ItemCategory,
  as: 'categories_ids',
  attributes: ['category_id']
 }]
});

答案 1 :(得分:1)

由于默认情况下嵌套关联数据的排列方式,您实际上不能这样做。

假设您做了

Item.findOne({
 where: { item_id: 1}, 
 include: [{
  model: ItemCategory,
  as: 'categories_ids',
  attributes: ['category_id']
 }]
})

您会得到

{
    id: 1,
    categories_ids: [
        { category_id: 1 },
        { category_id: 2 },
        {...},
        {...}
    ],
    price: 20,
}

您可能可以重新安排其中的信息,这涉及以下过程:

let pojo = JSON.parse(JSON.stringify(data))

pojo.categories_ids.forEach(function(el, index) {
    pojo.categories_ids[index] = el.category_id
})