如何在Sequelize中构建EXISTS子句

26

我有一个模型,其中有三个实体:

User
Project
Contributor

一个项目有一个所有者(即用户),并且有多个贡献者(即用户)。在我的仪表板中,我想列出一个用户的项目,即该用户是所有者或贡献者的所有项目。

使用Project.findAll({where: [owner: user]})查找所有者项目很简单。如何修改此代码以找到该用户还是贡献者的项目?这将(在数据库查询中)转换为使用EXISTS子句的子查询。

3个回答

17

通常您可以在where子句中使用exists,如下所示:

Project.findAll({
    where: {
         $and:[sequelize.literal('exists (select 1 from "someTable" where ...)']
    }
})

1
工作了,但我不得不进行更改,我使用了[Op.and]代替$and,这个更改使它工作了。谢谢。 - Fábio BC Souza
如果我有两个“exists”子句怎么办?第一个子句将被覆盖。 - Liam lin

8
例如,我们定义以下关联:
Project.belongsToMany( User, {through: 'Contributor'} );
User.belongsToMany( Project, {through: 'Contributor'} );

Project.belongsTo( User, { as: 'Owner', foreignKey: 'owner'} );

如果您想查找用户既是贡献者又是所有者的项目,可以按以下方式进行操作:
user.getProjects({ where: {owner: user.id} });

1

我不是Sequelize的用户,但从文档中看来,似乎可以在where子句中简单地使用$contains运算符。例如:

Project.findAll({
    where: {
        owner: user,
        contributors: {
            $contains: [user.id]
        }
    }
});

1
$contains映射到PostgreSQL的'@>'运算符,用于数组类型,但不适用于实体之间的关系。 - Joe Lee-Moyet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接