Node.js 延续“反向”关系

Node.js 延续“反向”关系,node.js,database,orm,sequelize.js,Node.js,Database,Orm,Sequelize.js,不确定我是否只是在装傻,但在续集方面遇到了一些困扰我的问题 序言 假设你有像Sequelize网站提供的例子那样的用户和项目,让事情变得简单 对于本例中的n:m关系,可以将一个用户分配给多个项目,反之亦然 正确设置关系后,您应该能够调用以下命令: //To get the projects a user is assigned to: user.getProjects(); //To get the users assigned to a project: project.getUsers()

不确定我是否只是在装傻,但在续集方面遇到了一些困扰我的问题

序言

假设你有像Sequelize网站提供的例子那样的用户和项目,让事情变得简单

对于本例中的n:m关系,可以将一个用户分配给多个项目,反之亦然

正确设置关系后,您应该能够调用以下命令:

//To get the projects a user is assigned to:
user.getProjects();

//To get the users assigned to a project:
project.getUsers();
问题

虽然这已经很方便了,但如何访问“反向”关系,例如未分配给项目的用户,或用户不参与的项目

这是通过范围实现的,还是通过建立另一种关系实现的


亲切问候:

有两种方法可以实现你的要求。第一种方法是使用getProjects或getUsers方法返回分配给用户/项目的对象,并使用它来返回未分配的记录,比如id不在

另一方面,您可以在用户模型上创建一些实例方法,如getUnassignedProjects,使用、和方法执行上述操作或类似操作

上面的代码将生成类似于此的查询

选择id,项目名称作为项目,其中Project.id不在从用户选择项目\u userId=1的项目中;
当然,users\u projects是以n:m关系连接用户和项目的表。

这正是我要找的东西。非常感谢。我实现了实例方法,因为它保持了所有其他代码的整洁。干杯
user.getProjects().then(projects => {
    let mappedProjects = projects.map(project => {
        return project.id;
    });

    Project.all({
        where: { id: { $notIn: mappedProjects } }
    }).then(projects => {
        // projects not assigned to 'user'
    });
});
instanceMethods: {
    getUnassignedProjects: function(){
        return sequelize.models.Project.all({
            where: sequelize.where(
                sequelize.col('Project.id'),
                ' NOT IN ',
                sequelize.literal(`(SELECT "projectId" FROM users_projects WHERE "userId" = ${this.id})`)
            )
        });
    }
}