我有三个模型,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列?
答案 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'
}]
})
注意:如果在查找选项中使用“限制”,则此解决方案会中断。作为替代方案,您可以获取所有结果,然后手动限制它们。