如何从Sequelize的输出中删除关联?

时间:2017-02-16 23:35:30

标签: node.js express sequelize.js

我为模型用户定义了classMethod

// model user.js
classMethods: {
    associate: function(models) {
        User.belongsToMany(models.project, {through: 'user_project', foreignKey: 'user_id', otherKey: 'project_id'})
    }
}

从Express i中的路线然后查询该用户的项目并将其输出为JSON

user.getProjects({
    attributes: ['id', 'title'],
})
.then(function(projects) {
    res.json(projects)
})

这很好,除了输出还包含我想要隐藏/省略/删除的user_project属性

[
  {
    "id": 8,
    "title": "Some project",
    "user_project": {
       "created_at": "2017-02-16T22:52:48.000Z",
       "updated_at": "2017-02-16T22:52:48.000Z",
       "project_id": 8,
       "user_id": 5
     }
  },
  //etc.

我尝试过各种exclude和include语句,但输出总是包含它。

有没有办法在输出中没有显示?

3 个答案:

答案 0 :(得分:6)

我偶然发现了解决方案。

要从联接表中删除属性,您可以使用joinTableAttributes,如下所示:

user.getProjects({
    attributes: ['id', 'title'],
    joinTableAttributes: []
})
.then(function(projects) {
    res.json(projects)
})

通过这样做,它将删除user_project表的(参见OP)输出,结果为:

[
  {
    "id": 8,
    "title": "Test Project",
  },
  {
    "id": 4,
    "title": "Another one",
  }
]

答案 1 :(得分:1)

您应该尝试以下

 user.getProjects({
    attributes: ['id', 'title'],
    through: {
        attributes: []
    }
})
.then(function(projects) {
    res.json(projects)
})

答案 2 :(得分:0)

对我来说唯一的方法是将中间表的DefaultScope定义为

{ attributes: [] }

我正在使用Sequelize @ 5