如何在不加载关联对象的情况下通过关联查询续集?

时间:2016-09-08 10:00:36

标签: node.js sequelize.js

我有多个相互关联的模型。

e.g:

var User = sequelize.define("user")
var Project = sequelize.define("project")

Project.hasMany(User)

现在我想查询包含特定用户的所有项目。

e.g:

Project.findAll({
    include: [
        {
            model: User,
            where: { id }
        }
    ]
})

这有效,但也会加载用户并将其附加到项目中。 我怎么能告诉sequelize,不应该将用户添加到找到的项目中?

2 个答案:

答案 0 :(得分:1)

我刚刚设法解决了同样的问题(使用Sequelize 4)。

您可以指定不希望仅使用attributes: []来使用User的任何字段,因此您的代码将变为:

Project.findAll({
    include: [
        {
            attributes: [],
            model: User,
            where: { id }
        }
    ]
})

答案 1 :(得分:0)

在双方的sequelize中使用belongsToMany()方法定义多对多关系。对于您的特定用例,您必须使用直通模型进行关系并直接查询直通模型。

var User = sequelize.define("user")
var Project = sequelize.define("project")
var ProjectUser = sequelize.define("projectUser")

Project.belongsToMany(User, {
    through: ProjectUser
})

User.belongsToMany(Project, {
    through ProjectUser
});

ProjectUser.findAll({
    where: {
        UserId: 'someId'
    },
    // We only want the project, not the user.
    // You might need to do ProjectUser.belongsTo() for both
    // models for this to work.
    include: [Project]
})
.then(function(results) {
    // Here we are getting an array of ProjectUsers, to return all the projects
    // we map it to a new array of only projects.
    return results.map(function(userProject) {
        return userProject.Project;
    });
})