Sequelize'反向'关系

时间:2017-04-11 10:27:41

标签: node.js database orm sequelize.js

不确定我是不是很傻,但遇到了一些让我对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();

问题

虽然这已经非常方便,但如何访问“反向”关系,例如未分配给项目的用户,或项目用户不属于强>

这是通过范围实现的,还是可以通过创建另一种关系来实现?

亲切的问候:)

1 个答案:

答案 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关系连接用户和项目的表。