我正在尝试执行一个OR语句同时引用根表属性和关联表属性的查询。我尝试了以下失败的操作,因为SQL无法在整个查询范围内访问别名:
const group = await SocialGroup.findOne({
attributes: ['id'],
where: {
id: {
[Op.eq]: id,
},
[Op.or]: [
{
adminId: {
[Op.eq]: ctx.socialUser.id,
},
},
{
['$roles.userId$']: {
[Op.eq]: ctx.socialUser.id,
},
},
],
},
include: [
{
model: models.SocialGroupRight,
as: 'roles',
required: false,
},
],
});
错误消息为Unknown column 'roles.userId' in 'where clause
。它确实生成查询。
我最新使用sequelize 4.x
答案 0 :(得分:0)
看起来像findOne()方法中的错误。使用findAll()测试类似的查询可以得到此SQL,该SQL可以正常运行:
SELECT ...
FROM sg
LEFT OUTER JOIN sgr
ON sg.id = sgr.sg_id
WHERE (sg.id = 1 OR sgr.name = 'hello');
但是更改为findOne()会给出此无效的SQL:
SELECT ...
FROM (
SELECT ...
FROM sg
WHERE (sg.id = 1 OR sgr.name = 'hello')
LIMIT 1
) AS xxx
LEFT OUTER JOIN sgr
ON sg.id = sgr.sg_id;
WHERE子句和LIMIT关键字应用于连接的之前,从而破坏了查询。 FWIW将findAll()与limit: 1
一起使用也做了同样的事情。
对不起,我没有更有用的答案。...