我正在尝试执行一个查询,其中 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
。它确实会生成查询。
我使用续集 4.x 最新
看起来像 findOne(( 方法中的一个错误。 使用 findAll(( 测试类似的查询给出了这个 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
做了同样的事情。
对不起,我没有更有用的答案....