Node.js 如何在sequelize中构建EXISTS子句
我有一个模型,其中有3个实体: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
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个存在子句怎么办?第一条将被覆盖。