Node.js 如何在sequelize中构建EXISTS子句

Node.js 如何在sequelize中构建EXISTS子句,node.js,sequelize.js,Node.js,Sequelize.js,我有一个模型,其中有3个实体: User Project Contributor 一个项目有一个所有者(用户)和多个贡献者(用户)。在我的仪表板中,我想列出用户的项目,即用户是所有者或参与者的所有项目 使用Project.findAll({where:[owner:user]})查找拥有的项目非常简单。我如何修改它以找出用户也是参与者的项目?这将(在数据库查询中)转换为使用EXISTS子句的子查询。例如,我们定义下一个关联: Project.belongsToMany( User, {thro

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

User
Project
Contributor
一个项目有一个所有者(用户)和多个贡献者(用户)。在我的仪表板中,我想列出用户的项目,即用户是所有者或参与者的所有项目


使用
Project.findAll({where:[owner:user]})
查找拥有的项目非常简单。我如何修改它以找出用户也是参与者的项目?这将(在数据库查询中)转换为使用EXISTS子句的子查询。

例如,我们定义下一个关联:

Project.belongsToMany( User, {through: 'Contributor'} );
User.belongsToMany( Project, {through: 'Contributor'} );

Project.belongsTo( User, { as: 'Owner', foreignKey: 'owner'} );
如果要查找用户既是参与者又是所有者的项目,可以这样做:

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

这里不是Sequelize用户,但在阅读文档时,您只需在where子句中使用$contains运算符即可。比如:

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

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

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

$包含对数组类型映射到PostgreSQL的“@>”运算符,对实体之间的关系不起作用。已起作用,但我必须更改,
$和
我使用了
[Op.and]
,更改使其起作用。谢谢。如果我有2个
存在
子句怎么办?第一条将被覆盖。