在Sequelize中,如何对$或语句中的关联执行where查询?

时间:2017-06-04 02:26:37

标签: associations sequelize.js

我有三个模型,User,Project和ProjectMember。为简单起见,模型具有以下属性:

User
    - id

Project
    - id
    - owner_id
    - is_published

ProjectMember
    - user_id
    - project_id

使用sequelize.js,我想找到项目所有者是特定用户的所有项目,或者该用户是该用户的项目的项目成员,或项目发布的项目成员。我想原始SQL看起来像这样:

SELECT p.*
FROM Project p
LEFT OUTER JOIN ProjectMember m
    ON p.id = m.project_id
WHERE m.user_id = 2
    OR p.owner_id = 2
    OR p.is_published = true;

关于如何对关联执行查询有很多例子,但是我没有找到关于如何有条件地执行查询的例子。我已经能够使用此代码查询关联:

projModel.findAll({
    where: { },
    include: [{
        model: memberModel,
        as: 'projectMembers',
        where: { 'user_id': 2 }
    }]
})

如何将这个结合到$中的查询或检查项目的owner_id和is_published列?

1 个答案:

答案 0 :(得分:2)

这令人沮丧,我工作了几个小时试图解决这个问题,我一问这里就找到了办法。事实证明,sequelize.js开发人员最近添加了在where where查询中使用原始键的功能,使得(最后)可以查询main where子句内的关联。

这是我的解决方案:

projModel.findAll({
    where: {
        $or: {
            '$projectMembers.user_id$': 2,
            owner_id: 2,
            is_published: true
        }
    },
    include: [{
        model: memberModel,
        as: 'projectMembers'
    }]
})

注意:如果在查找选项中使用“限制”,则此解决方案会中断。作为替代方案,您可以获取所有结果,然后手动限制它们。