【问题标题】:Sequelize 'Inverse' Relationship续集“反向”关系
【发布时间】:2017-09-06 16:31:53
【问题描述】:

不确定我是不是傻,但遇到了一些让我对 Sequelize 感到困惑的事情。

序言

假设您有 UsersProjects,就像 Sequelize 网站提供的示例一样,以保持简单。

对于此示例,使用 n:m 关系,可以将一个用户分配到多个项目,反之亦然。

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

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

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

问题

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

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

亲切的问候:)

【问题讨论】:

    标签: node.js database orm sequelize.js


    【解决方案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'
        });
    });
    

    另一方面,您可以在User 模型上创建一些实例方法,如getUnassignedProjects(),使用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 关系连接用户和项目的表。

    【讨论】:

    • 这正是我一直在寻找的东西。非常感激。我实现了实例方法,因为它使所有其他代码保持整洁。干杯!
    猜你喜欢
    • 2021-03-11
    • 2020-12-16
    • 2015-12-25
    • 2018-12-09
    • 2018-10-27
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多