Node.js 延续“反向”关系
不确定我是否只是在装傻,但在续集方面遇到了一些困扰我的问题 序言 假设你有像Sequelize网站提供的例子那样的用户和项目,让事情变得简单 对于本例中的n:m关系,可以将一个用户分配给多个项目,反之亦然 正确设置关系后,您应该能够调用以下命令: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()
//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})`)
)
});
}
}