不确定我是不是很傻,但遇到了一些让我对Sequelize感到难过的事。
序言
假设您有用户和项目,就像Sequelize网站提供的示例一样,为了简单起见。
对于此示例,使用 n:m 关系,可以将一个用户分配给多个项目,反之亦然。
正确设置关系后,您应该可以调用以下内容:
//To get the projects a user is assigned to:
user.getProjects();
//To get the users assigned to a project:
project.getUsers();
问题
虽然这已经非常方便,但如何访问“反向”关系,例如未分配给项目的用户,或项目用户不属于强>
这是通过范围实现的,还是可以通过创建另一种关系来实现?
亲切的问候:)
答案 0 :(得分:1)
有几种方法可以实现您的要求。第一种方法是使用getProjects()
或getUsers()
方法返回分配给User/Project
的对象并使用它来返回未分配的记录(类似id NOT IN (...)
)
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'
});
});
另一方面,您可以在getUnassignedProjects()
模型上创建一些实例方法,例如User
,使用sequelize.literal()
,sequelize.where()
执行上述操作或类似操作sequelize.col()
方法
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})`)
)
});
}
}
上面的代码会生成与此类似的查询
SELECT "id", "name" FROM "projects" AS "Project" WHERE "Project"."id" NOT IN (SELECT "project" FROM users_projects WHERE "userId" = 1);
users_projects
当然是以n:m关系连接用户和项目的表。